Web端获取访问者IP

实际开发过程中,服务器后台需要知道访问者ip,此时我们需要获取ip并记录。

HTTP header 中的 Host 含义为所请求的目的主机名。HTTP header 中的 X_Forward_For 表示该条 http 请求是由谁发起的,即是我们需要获取的访问者IP。

建立工具类,java端代码:

public class IPUtils {

    /**
     * 获取访问者IP
     * 
     * HTTP header中的X_Forward_For表示该条http请求是由谁发起的,即是访问者IP
     * 
     * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效,获取的是nginx地址。
     * 
     * Request.getRemoteAddr()实际上是获取的$remote_addr,$remote_addr是nginx的导出变量,可在nginx.conf中直接使用
     * 
     * 那么则可以在离用户最近的前端代理nginx上获取X_Forward_For,将其存放于$remote_addr中,此时在web端使用Request.getRemoteAddr()直接获取访问者IP
     * 
     * 具体配置:
     * proxy_set_header Host $host;
     * proxy_set_header X-Forward-For $remote_addr;
     * 
     * @param request
     * @return
     */
    public static String getIpAddr(HttpServletRequest request) {

        String ip = request.getHeader("X-Forward-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("WL-Proxy-Client-IP");  
        }  
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
        }  
        return ip;  
    }
}

nginx配置:

location / {
    proxy_pass http://localhost:8080/mate/; # 转发请求到tomcat下mate项目
    proxy_set_header Host $host; # 避免http请求中丢失Host头部时Host不被重写
    proxy_set_header X-Forward-For $remote_addr; # 获取http请求的ip值存储到$remote_addr
}

以上proxy_pass配置请自动忽略,与本实例无关。

更多参考:https://yq.aliyun.com/articles/42168

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值