SpringBoot系列:获取当前登录用户IP

简介: SpringBoot系列:获取当前登录用户IP前言今天博主将为大家分享SpringBoot系列:获取当前登录用户IP,不喜勿喷,如有异议欢迎讨论!有一个强大的地基才能写出健壮的程序!活不多说上代码控制器方法:package com.

SpringBoot系列:获取当前登录用户IP
前言
今天博主将为大家分享SpringBoot系列:获取当前登录用户IP,不喜勿喷,如有异议欢迎讨论!

有一个强大的地基才能写出健壮的程序!

活不多说上代码
控制器方法:

package com.cyj.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.cyj.util.IpUtil;

/**

  • @Description: 获取ip控制器
  • @ClassName: IpController.java
  • @author ChenYongJia
  • @Date 2019年4月20日 晚上20:25
  • @Email chen87647213@163.com
    */

@RestController
public class IpController {


@RequestMapping(value = "/getIp", method = RequestMethod.POST)
public String getIp(HttpServletRequest request) {
    return IpUtil.getIpAddr(request);
}

}

工具类方法

package com.jmccms.util;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.net.*;
import java.util.Enumeration;

/**

  • @Description: 获取IP方法
  • @BelongsProject: Jmccms
  • @BelongsPackage: com.jmccms.util
  • @Author: ChenYongJia
  • @CreateTime: 2019-05-14 22:29
  • @Email chen87647213@163.com
    */

@Slf4j
public class IpUtils {

private static final String LOCAL_IP = "127.0.0.1";

public static String getIpAddr(HttpServletRequest request) {
    if (request == null) {
        return "unknown";
    }
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("X-Forwarded-For");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("X-Real-IP");
    }

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }

    return "0:0:0:0:0:0:0:1".equals(ip) ? LOCAL_IP : ip;
}

public static boolean internalIp(String ip) {
    boolean res = false;
    byte[] addr = textToNumericFormatV4(ip);
    if (addr != null && ip != null) {
        res = internalIp(addr) || LOCAL_IP.equals(ip);
    }
    return res;
}

private static boolean internalIp(byte[] addr) {
    final byte b0 = addr[0];
    final byte b1 = addr[1];
    // 10.x.x.x/8
    final byte SECTION_1 = 0x0A;
    // 172.16.x.x/12
    final byte SECTION_2 = (byte) 0xAC;
    final byte SECTION_3 = (byte) 0x10;
    final byte SECTION_4 = (byte) 0x1F;
    // 192.168.x.x/16
    final byte SECTION_5 = (byte) 0xC0;
    final byte SECTION_6 = (byte) 0xA8;
    boolean flag = false;
    switch (b0) {
        case SECTION_1:
            flag = true;
            break;
        case SECTION_2:
            if (b1 >= SECTION_3 && b1 <= SECTION_4) {
                flag = true;
            }
            break;
        case SECTION_5:
            if (b1 == SECTION_6) {
                flag = true;
            }
            break;
        default:
            break;
    }
    return flag;
}

/**
 * 将IPv4地址转换成字节
 *IPv4地址
 * @param text
 * @return byte 字节
 */
public static byte[] textToNumericFormatV4(String text) {
    if (text.length() == 0) {
        return null;
    }

    byte[] bytes = new byte[4];
    String[] elements = text.split("\\.", -1);
    try {
        long l;
        int i;
        switch (elements.length) {
            case 1:
                l = Long.parseLong(elements[0]);
                if ((l < 0L) || (l > 4294967295L))
                    return null;
                bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 2:
                l = Integer.parseInt(elements[0]);
                if ((l < 0L) || (l > 255L))
                    return null;
                bytes[0] = (byte) (int) (l & 0xFF);
                l = Integer.parseInt(elements[1]);
                if ((l < 0L) || (l > 16777215L))
                    return null;
                bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 3:
                for (i = 0; i < 2; ++i) {
                    l = Integer.parseInt(elements[i]);
                    if ((l < 0L) || (l > 255L))
                        return null;
                    bytes[i] = (byte) (int) (l & 0xFF);
                }
                l = Integer.parseInt(elements[2]);
                if ((l < 0L) || (l > 65535L))
                    return null;
                bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                bytes[3] = (byte) (int) (l & 0xFF);
                break;
            case 4:
                for (i = 0; i < 4; ++i) {
                    l = Integer.parseInt(elements[i]);
                    if ((l < 0L) || (l > 255L))
                        return null;
                    bytes[i] = (byte) (int) (l & 0xFF);
                }
                break;
            default:
                return null;
        }
    } catch (NumberFormatException e) {
        log.error("数字格式化异常",e);
        return null;
    }
    return bytes;
}

public static String getLocalIP() {
    String ip = "";
    if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
        InetAddress addr;
        try {
            addr = InetAddress.getLocalHost();
            ip = addr.getHostAddress();
        } catch (UnknownHostException e) {
            log.error("获取失败",e);
        }
        return ip;
    } else {
        try {
            Enumeration<?> e1 = (Enumeration<?>) NetworkInterface
                    .getNetworkInterfaces();
            while (e1.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) e1.nextElement();
                if (!ni.getName().equals("eth0")) {
                    continue;
                } else {
                    Enumeration<?> e2 = ni.getInetAddresses();
                    while (e2.hasMoreElements()) {
                        InetAddress ia = (InetAddress) e2.nextElement();
                        if (ia instanceof Inet6Address)
                            continue;
                        ip = ia.getHostAddress();
                        return ip;
                    }
                    break;
                }
            }
        } catch (SocketException e) {
            log.error("获取失败",e);
        }
    }
    return "";
}

}

到这里SpringBoot系列:获取当前登录用户IP,分享完毕了,快去试试吧!

作者:陈永佳
来源:CSDN
原文:https://blog.csdn.net/Mrs_chens/article/details/90475108
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
1月前
|
缓存 前端开发 Java
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
31 1
|
6月前
|
小程序 Java API
【Java】Spring boot快速上手(三)前后端分离实现小程序登录(接口篇)
【Java】Spring boot快速上手(三)前后端分离实现小程序登录(接口篇)
123 0
|
2月前
|
前端开发 安全 Java
SpringBoot 实现登录验证码(附集成SpringSecurity)
SpringBoot 实现登录验证码(附集成SpringSecurity)
|
19天前
|
Java 测试技术 数据库
基于SpringBoot+HTML实现登录注册功能模块
基于SpringBoot+HTML实现登录注册功能模块
|
3月前
|
前端开发 Java 数据库连接
【Java实战篇】SpringBoot+MyBatis快速实现登录注册
【1月更文挑战第19天】【Java实战篇】SpringBoot+MyBatis快速实现登录注册
|
1月前
|
前端开发 JavaScript Java
springboot 集成easy-captcha实现图像验证码显示和登录
springboot 集成easy-captcha实现图像验证码显示和登录
135 0
|
1月前
|
存储 NoSQL 前端开发
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
|
1月前
|
算法 前端开发 JavaScript
SpringBoot+随机盐值+双重MD5实现加密登录
SpringBoot+随机盐值+双重MD5实现加密登录
177 1
|
1月前
|
缓存 前端开发 Java
spring boot3登录开发-3(账密登录逻辑实现)
spring boot3登录开发-3(账密登录逻辑实现)
48 1
|
1月前
|
存储 JSON Java
spring boot3登录开发-1(整合jwt)
spring boot3登录开发-1(整合jwt)
56 1

热门文章

最新文章