获取请求来源ip地址

package com.common;

import javax.servlet.http.HttpServletRequest;

public class RemortIP {

    private static final String[] PROXY_REMOTE_IP_ADDRESS = { "X-Forwarded-For","Proxy-Client-IP", "WL-Proxy-Client-IP", "X-Real-IP" }; 

    private static final Pattern INNER_IP_ADDR_RE = Pattern.compile("(10\\.)|(172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\.)|(192\\.168\\.)");

    /**
     * 是否局域网ip地址
     * @time 2016年6月22日
     * @param ip
     * @return true 是,false 否
     */
    public static boolean isInnerIpAddr(String ip) {
        Matcher ipmatcher = INNER_IP_ADDR_RE.matcher(ip);
        return ipmatcher.find();
    }
    /**
     * 获取客户端真实ip
     * @time 2016年6月22日
     * @param req
     * @return
     */
    public static String getClientIP(HttpServletRequest req) {
        String ip = "";
        for (int i=0; i<PROXY_REMOTE_IP_ADDRESS.length; ++i) {
            ip = req.getHeader(PROXY_REMOTE_IP_ADDRESS[i]);
            if (StringUtils.isEmpty(ip) || ip.equalsIgnoreCase("unknown")) continue;
            ip = getRemoteIpFromForward(ip.trim()).trim();
            if (!isInnerIpAddr(ip)) {
                return ip;
            }
        }
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getRemoteAddr();
        }
        return ip;
    }

    /** 
     * <p> 
     * 从 HTTP Header 中截取客户端连接 IP 地址。如果经过多次反向代理, 
     * 在请求头中获得的是以“,&lt;SP&gt;”分隔 IP 地址链,第一段为客户端 IP 地址。 
     * </p> 
     * 
     * @param xforwardIp 从 HTTP 请求头中获取转发过来的 IP 地址链 
     * @return 客户端源 IP 地址 
     */  
    private static String getRemoteIpFromForward( String xforwardIp ) {  
        int commaOffset = xforwardIp.indexOf( ',' );  
        if ( commaOffset < 0 ) {  
            return xforwardIp;  
        }  
        return xforwardIp.substring( 0 , commaOffset );  
    } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值