文档章节

IP相关工具类

蓝汀华韶
 蓝汀华韶
发布于 2016/04/19 17:17
字数 319
阅读 24
收藏 1
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Pattern;

/**
 * Created by IDEA
 * User: mashaohua
 * Date: 2016-04-13 9:13
 * Desc:
 */
public class IPUtil {

    /**
     * 获取客户端ip
     *
     */
    public static String getIp(HttpServletRequest request) {

        String ipAddress = request.getHeader("x-forwarded-for");

        if(!verifyIp(ipAddress)) {
            ipAddress = request.getHeader("X-Real-IP");
            if(!verifyIp(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
                if(!verifyIp(ipAddress)) {
                    ipAddress = request.getHeader("WL-Proxy-Client-IP");
                    if(!verifyIp(ipAddress)) {
                        ipAddress = request.getRemoteAddr();
                        if(ipAddress.equals("127.0.0.1")){
                            //根据网卡取本机配置的IP
                            InetAddress inet = null;
                            try {
                                inet = InetAddress.getLocalHost();
                                ipAddress = inet.getHostAddress();
                            } catch (UnknownHostException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
        //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if(ipAddress != null && ipAddress.length() > 15){ //"***.***.***.***".length() = 15
            if(ipAddress.indexOf(",") > 0){
                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
            }
        }

        return ipAddress;
    }


    private final static Pattern ipPattern = Pattern.compile("\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b");

    public static boolean verifyIp(String ip) {
        if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip))
            return false;

        return ipPattern.matcher(ip).matches();
    }

    public static long ipToLong(String ip){
        long[] array = new long[4];
        int position1 = ip.indexOf(".");
        int position2 = ip.indexOf(".", position1 + 1);
        int position3 = ip.indexOf(".", position2 + 1);
        array[0] = Long.parseLong(ip.substring(0, position1));
        array[1] = Long.parseLong(ip.substring(position1+1, position2));
        array[2] = Long.parseLong(ip.substring(position2+1, position3));
        array[3] = Long.parseLong(ip.substring(position3+1));
        return (array[0] << 24) + (array[1] << 16) + (array[2] << 8) + array[3];
    }

    public static String ipToString(long ip){
        StringBuffer sb = new StringBuffer("");
        sb.append(String.valueOf((ip >>> 24)));
        sb.append(".");
        sb.append(String.valueOf((ip & 0x00FFFFFF) >>> 16));
        sb.append(".");
        sb.append(String.valueOf((ip & 0x0000FFFF) >>> 8));
        sb.append(".");
        sb.append(String.valueOf((ip & 0x000000FF)));
        return sb.toString();
    }
}


© 著作权归作者所有

共有 人打赏支持
蓝汀华韶
粉丝 36
博文 77
码字总数 80082
作品 0
海淀
程序员
私信 提问
自己做工具--封装PHP的工具类

更多精彩请访问,请一定记得 star :https://github.com/whm19940308/phpTools 转载请标明原文链接:https://www.jianshu.com/p/8ab3dce8d6f1 一、使用示例 二、代码目录 主要有几大工具类:...

whmblog
08/26
0
0
Linux系统管理第五周作业【Linux微职位】

1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(Network Bridge):工作在OSI模型的第二层数据链路层,主要用于将两个局域网(LAN)连起来,根据MAC地址...

akatsuki1023
06/29
0
0
2018年上半年短视频行业黑灰产研究报告

      声明:   本报告版权属于威胁猎人情报中心,与FreeBuf独家联合发布,并受法律保护。转载、摘编或利用其它方式使用本报告文字或者观点的,应注明“来源:威胁猎人 ”。违反上述声...

FreeBuf
08/23
0
0
python 代理池升级版v1.1

python 代理池升级版v1.1 概述 前段时间,因为项目的需要,简单的实现了一个代理池,只是实现了预想的基本功能,后边想在完善。可是没想到我太(tai)忙(lan)了(le),之前也有反馈各种bug,一直...

起个名忒难
2017/11/12
0
0
Java微信公众平台开发_02_启用服务器配置

一、准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:【 Java微信公众平台开发01本地服务器映射外网 】 2.一个微信公众平台账号: 去注册:(https://mp.weixin.qq.com/) 3.策略...

rayner
2017/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
52分钟前
11
3
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
12
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
18
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部