1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 根据HttpServletRequest获取用户IP地址及判断当前IP是否是内网IP

根据HttpServletRequest获取用户IP地址及判断当前IP是否是内网IP

时间:2019-10-07 23:04:11

相关推荐

根据HttpServletRequest获取用户IP地址及判断当前IP是否是内网IP

最近项目上遇到了获取登录IP并判断是否是内网IP的需求,在此整理一下实现方法。

首先用户登录后,我们可以通过HttpServletRequest的request对象获取用户IP,但这些IP不一定是用户的真实IP。

下面是一些常见请求头:

X-Forwarded-For:Squid 服务代理

Proxy-Client-IP:apache 服务代理

WL-Proxy-Client-IP:weblogic 服务代理

HTTP_CLIENT_IP:有些代理服务器

X-Real-IP:nginx服务代理

通过对请求头的过滤,尽可能的获取真实IP:

String ip = request.getHeader("x-forwarded-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();}

通过以上的方法可以得到当前用户的IP,接下来就需要判断此IP是否是内网IP。

内网IP通常是下面几个网段的IP,用户可以自己设置:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

确定了以上网段,接下来只需要做判断IP是否属于以上3个网段就行了:

public boolean isInner(String ip){String reg = "((192\\.168|172\\.([1][6-9]|[2]\\d|3[01]))"+ "(\\.([2][0-4]\\d|[2][5][0-5]|[01]?\\d?\\d)){2}|"+ "^(\\D)*10(\\.([2][0-4]\\d|[2][5][0-5]|[01]?\\d?\\d)){3})";Pattern p = pile(reg);Matcher matcher = p.matcher(ip);return matcher.find();}

下面附上私有网段的正则表达式:

A类地址范围:10.0.0.0—10.255.255.255正则表达式 ^10\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])$B类地址范围:172.16.0.0---172.31.255.255正则表达式 ^172\.(1[6789]|2[0-9]|3[01])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])$C类地址范围:192.168.0.0---192.168.255.255正则表达式 ^192\.168\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[0-9])$

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。