通过Request获取客户端的真实IP
我们在做项目的时候经常需要获取客户端的真实ip去进行判断,为此搜索了相关文章,以下这个讲解的比较明白,直接拿来
https://blog.csdn.net/yin_jw/article/details/24470131
在Servlet里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,Nginx等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,例如将http://192.168.101.88:80/ 的URL反向代理为http://pay.kedou.com/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或192.168.101.88,而并不是客户端的真实IP。
如下图,原来是client端直接请求服务端,走A路线请求,这时候通过request.getRemoteAddr()方法可以准备的获取客户端的IP。但是做了代理之后呢,client端不是直接请求服务端,而是走B线路请求代理服务器,由代理器去请求服务端,这时候服务端通过request.getRemoteAddr()方法拿到的理所当然是代理服务器的地址了。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.xxx.com/index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
下面的获取真实IP的Java类:
- /**
- * 常用获取客户端信息的工具
- *
- */
- public final class NetworkUtil {
- /**
- * Logger for this class
- */
- private static Logger logger = Logger.getLogger(RandomCodeUtils.class);
- /**
- * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
- *
- * @param request
- * @return
- * @throws IOException
- */
- public final static String getIpAddress(HttpServletRequest request) throws IOException {
- // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
- String ip = request.getHeader("X-Forwarded-For");
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("Proxy-Client-IP");
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
- }
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("WL-Proxy-Client-IP");
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
- }
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_CLIENT_IP");
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
- }
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getHeader("HTTP_X_FORWARDED_FOR");
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
- }
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
- ip = request.getRemoteAddr();
- if (logger.isInfoEnabled()) {
- logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
- }
- }
- } else if (ip.length() > 15) {
- String[] ips = ip.split(",");
- for (int index = 0; index < ips.length; index++) {
- String strIp = (String) ips[index];
- if (!("unknown".equalsIgnoreCase(strIp))) {
- ip = strIp;
- break;
- }
- }
- }
- return ip;
- }
- }
通过Request获取客户端的真实IP的更多相关文章
- java代码获取客户端的真实ip
java代码获取客户端的真实ip protected String getIpAddr(HttpServletRequest request) { String ip = request.getHea ...
- 获取客户端用户真实ip方法整理(jekyll迁移)
layout: post title: 获取客户端用户真实ip方法整理 date: 2019-08-22 author: xiepl1997 tags: springboot 由请求获取客户端ip地址 ...
- 通过HttpservletRequest对象获取客户端的真实IP地址
这篇文章主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache.Squid.nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下 在JSP里 ...
- 使用request获取访问者的真实IP
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- PHP获取客户端的真实IP
REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...
- php 获取客户端的真实ip地址 通过第三方网站
<?php include 'simple_html_dom.php'; // 1获取真实IP地址方式 function get_onlineip() { $ch = curl_init('ht ...
- 获取客户端访问真实 IP
转载自:https://www.qikqiak.com/post/get-client-realip/ 通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的, ...
- 服务器受到网络攻击时,如何获取请求客户端的真实 IP?
网络攻击 前不久公司遭受了一次网络攻击. 早晨刚到公司,就发现登录接口的调用次数飙升,很快就确认是被恶意攻击,让安全部门做网关入口针对对方 IP 加了限制. 并统一对所有的 IP 加了调用的频率限制. ...
- 根据Request获取客户端IP 内网IP及外网IP
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
随机推荐
- JDBC和连接池
JDBC 所有的数据库操作框架都是用在JDBC的基础上做多次封装的,因为JDBC的操作很复杂 引入Jar包 连接数据库操作 书写sql语句,传参 查询,取值 关闭连接 //1.注册驱动(静态方法)(包 ...
- 使用总结:java多线程总结 <转载>
转载 https://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html java多线程总结 2011-08-28 20:08 Ro ...
- NO23 Linux正则表达式结合三剑客企业级实践--取IP
企业实践: 一.取IP的方法(用三剑客): grep: awk: sed:虽有三种,但是思路是一样的,用到正则有些表达细节不一样而已. 分析: sed***: 课堂试题: |sed -nr 's#^. ...
- Windows 10长脸了!
Windows 10一直毁誉参半,但是在微软的持续升级完善之下,同时随着时间的流逝,已经顺利成为全球第一大桌面操作系统,并开始逐渐甩开Windows 7,全球设备安装量已经达到约8亿部. 根据最新的S ...
- kali linux 添加源 及为firefox esr 添加 flash 插件 --2017
终端 输入 vim /etc/apt/sources.list 在文件内写入 #中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non ...
- Netty 模型
Demo代码 使用Maven的话请在pom.xml中注入netty依赖 <!-- https://mvnrepository.com/artifact/io.netty/netty-all -- ...
- 八数码问题 双向BFS/Hsh链表存储
转自洛谷 作者EndSaH #include<iostream> #include<string> #include<cmath> #include<cstr ...
- mongodb单机版的安装和配置
首先根据操作系统下载MongoDB的相关安装文件 下载后上传到linux上,解压 将解压后的文件夹重新命名为monggodb4.0.1 命令mv 配置必要的文件夹mgdata存放运行数据,mglog存 ...
- Express - 采用bcryptjs进行密码加密
1.安装bcryptjs模块 npm install bcryptjs --save 2.在需要加密的模块中引入bcryptjs库 require('bcryptjs'); 实战 : /** ...
- Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in
原语句: db.carMongoDTO.aggregate({}}}, {}}}) 报错: Exceeded memory limit for $group, but didn't allow ext ...