java springboot获取用户ip

发布时间:2023-09-07 03:38:24
修改时间:2023-09-07 03:45:59
总阅读数:227
今日阅读数:0
昨日日阅读数:0
字数:2682

新建http工具类


import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.Assert;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class HttpUtils {

    static final String UNKNOWN = "unknown";


    /**
     * 获取当前web请求的来源ip
     *
     * @return ip地址
     */
    public static String getIp() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        Assert.notNull(requestAttributes, "获取不到ServletRequestAttributes,请确认当前处于Web请求的上下文中");
        HttpServletRequest request = requestAttributes.getRequest();
        return getIp(request);
    }

    /**
     * 获取request请求的来源ip
     *
     * @param request request请求
     * @return ip地址
     */
    public static String getIp(HttpServletRequest request) {
        if (request == null) {
            return UNKNOWN;
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        System.out.println(ip);
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }


}

添加nginx代理配置

如果请求直接由springboot接收,未经过nginx,则无需配置

增加配置: proxy_set_header X-Real-IP $remote_addr;

修改配置文件

location /api/ {

        proxy_set_header Cookie $http_cookie;
        proxy_cookie_path / /;
        proxy_set_header Host $http_host;
        
        # 增加以下配置转发请求ip
        proxy_set_header X-Real-IP $remote_addr;
        
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header request-uri $request_uri;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 3600s;

        rewrite /api(.*) /$1 break;
        proxy_pass http://127.0.0.1:8080;

    }