javaweb -- 获取请求IP(附实现源码)
- 实现步骤如下:
(1)新建一个java web工程
(2)新建servers包,新建类GetRequestIp,用来处理获取请求IP,GetRequestIp类完整代码如下:
package servers; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class GetRequestIp {
public static void post(HttpServletRequest request, HttpServletResponse response) { getIpAddress(request);
} public static String getIpAddress(HttpServletRequest request) { String ip = null;
ip = request.getHeader("x-forwarded-for");
System.out.println("x-forwarded-for:" + ip); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
System.out.println("request.getHeader(\"X-Forwarded-For\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
System.out.println("request.getHeader(\"Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
System.out.println("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
System.out.println("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
System.out.println("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
System.out.println("request.getRemoteAddr()=" + ip);
} if(null != ip && ip.indexOf(',') != -1)
{
//如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串 IP 值
//取X-Forwarded-For中第一个非unknown的有效IP字符串
//如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
//用户真实IP为: 192.168.1.110
//注意:当访问地址为 localhost 时 地址格式为 0:0:0:0:0:0:1
System.out.println("ip=" + ip);
String[] ips = ip.split(",");
for (int i = 0; i < ips.length; i++)
{
if(null != ips[i] && !"unknown".equalsIgnoreCase(ips[i]))
{
ip = ips[i];
break;
}
}
if("0:0:0:0:0:0:1".equals(ip))
{
System.out.println("由于客户端访问地址使用 localhost,获取客户端真实IP地址错误,请使用IP方式访问");
}
} if("unknown".equalsIgnoreCase(ip))
{
System.out.println("由于客户端通过Squid反向代理软件访问,获取客户端真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
} return ip;
}
}
(3)新建一个JSP页面,命名为MyRequest.jsp,完整代码如下:
<%@ page import="servers.GetRequestIp" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%> <%
out.clear();
out = pageContext.pushBody();
GetRequestIp.post(request, response);
%>
(4)运行,开启tomcat,在浏览器输入网址:http://127.0.0.1:8085/MyDemo/MyRequest.jsp,查看输出结果。
- 附:获取客户端IP地址时,使用不同代理时三个HTTP请求头的区别
(learn from:http://www.cnblogs.com/technic-emotion/articles/3701257.html)
一、没有使用代理服务器的情况:
- REMOTE_ADDR = 您的 IP
- HTTP_VIA = 没数值或不显示
- HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理服务器的情况:Transparent Proxies
- REMOTE_ADDR = 最后一个代理服务器 IP
- HTTP_VIA = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
- REMOTE_ADDR = 最后一个代理服务器 IP
- HTTP_VIA = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
此种情况,隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:Distorting Proxies
- REMOTE_ADDR = 代理服务器 IP
- HTTP_VIA = 代理服务器 IP
- HTTP_X_FORWARDED_FOR = 随机的 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
- REMOTE_ADDR = 代理服务器 IP
- HTTP_VIA = 没数值或不显示
- HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
javaweb -- 获取请求IP(附实现源码)的更多相关文章
- WebService跨域配置、Ajax跨域请求、附开发过程源码
项目开发过程中需要和其他公司的数据对接,当时我们公司提供的是WebService,本地测试,都是好的,Ajax跨域请求,就报错,配置WebService过程中,花了不少功夫,入不少坑,不过最终问题还是 ...
- 转:微信开发之使用java获取签名signature(贴源码,附工程)
微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报 分类: 微信开发 ...
- JavaWeb 获取请求网络协议、IP、端口号、项目根路径
JavaWeb 获取请求网络协议.IP.端口号.项目根路径 CreateTime--2018年6月1日16点32分 Author:Marydon 1.需求 在项目中,需要使用Java向本程序发送r ...
- Asp.net MVC集成Google Calendar API(附Demo源码)
Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...
- 微信公众平台开发-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...
- 微信公众平台开发2-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...
- 用Assert(断言)封装异常,让代码更优雅(附项目源码)
有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
随机推荐
- CAS 4.0.0RC 配置MD5验证功能
配置内容同一样,只是增加一些配置. 因为cas已经默认就支持MD5加密验证,所以只是修改一下配置就可以了. <bean id="primaryAuthenticationHandler ...
- Android 适配2
Android AutoLayout全新的适配方式 堪称适配终结者 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/4999094 ...
- python easy_install pip django
1. install python (2.7.8) 2. set PATH, add python27 3. python easy_install.py 4. easy_install pip 5. ...
- (转C#中Enum用法小结)
enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下 ...
- Spring声明式事务管理基于@Transactional注解
概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解. 第一种方式我已在上文为大 ...
- PAT/进制转换习题集
B1022. D进制的A+B (20) Description: 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. Input: ...
- 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...
- PC远程调试移动设备
我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题——调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...
- Unity3D热更新全书-下载 唯一的一篇
下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比 ...
- 根据Excel的内容和word模板生成对应的word文档
Sub setname() Dim I As Integer Dim pspname As String Dim pspnumber As String Dim path As String Dim ...