获取请求来源ip地址

来源:互联网 发布:中日互译软件 编辑:程序博客网 时间:2024/05/22 06:46
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
原创粉丝点击