首页 > 其他分享 >HttpServletRequest对象中获取客户端IP地址

HttpServletRequest对象中获取客户端IP地址

时间:2023-11-08 23:01:48浏览次数:34  
标签:HttpServletRequest 请求 ip request 获取 IP地址 客户端

什么是HttpServletRequest对象

HttpServletRequest对象是Java Servlet规范中定义的一种接口,它封装了客户端请求的所有信息,例如请求头、请求参数、请求方法、请求URL等。在Java Web开发中,HttpServletRequest对象非常常用,可以用来处理各种HTTP请求。

获取客户端IP地址的需求

在一些场景下,我们需要获取客户端的IP地址,例如:

网站的访问日志需要记录客户端IP地址,以便进行统计分析;

在网站防火墙、网站访问控制和购物车系统等应用中,需要限制某些IP地址的访问;

在会员系统中,需要根据IP地址进行安全认证和风控控制;

为了实现上述需求,我们需要在Java Web应用中获取客户端的IP地址。

从HttpServletRequest对象中获取IP地址

在Java Web应用中,我们可以通过HttpServletRequest对象中的getRemoteAddr()方法获取客户端的IP地址。例如:

String ipAddress = request.getRemoteAddr();

这个方法可以获取当前客户端的IP地址,但是有一个缺点,它获取的是Web应用服务器所接收到的客户端请求的IP地址,并不一定是客户端真实的IP地址。因为在现代网络环境下,往往存在代理服务器等中间节点,客户端请求可能经过多个服务器才最终到达Web应用服务器,这就导致了getRemoteAddr()方法不能获取真实的客户端IP地址。

为了获取客户端真实的IP地址,我们需要从请求头中获取该信息,HttpServletRequest对象中提供了一些获取请求头参数的方法,例如:

String headerValue = request.getHeader("Header-Name");

其中,"Header-Name"是请求头名称,我们可以通过该方法获取到请求头中指定的参数。因此,我们可以从请求头中获取客户端IP地址。

根据RFC7239规范(Forwarded HTTP Extension),代理服务器应该设置X-Forwarded-For请求头参数,并将客户端IP地址放在该参数中传递给下一个代理服务器或Web应用服务器。因此,我们可以从X-Forwarded-For请求头参数中获取客户端IP地址。

下面是一段获取客户端IP地址的示例代码:

public static String getRemoteIP(HttpServletRequest request) {

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

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip;

}

这段代码首先尝试从"X-Forwarded-For"请求头中获取客户端IP地址,如果没有获取成功,接着从"Proxy-Client-IP"和"WL-Proxy-Client-IP"请求头中依次获取客户端IP地址。如果还是没有获取成功,则返回HttpServletRequest对象中的IP地址。

而为了应对某些情况下代理服务器未设置X-Forwarded-For请求头的问题,我们也可以尝试从HTTP请求中解析出客户端IP地址。下面是一个示例代码:

public static String getRemoteIP(HttpServletRequest request) {

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

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

if (ip != null && ip.indexOf(",") >0 {

String[] parts = ip.split(“,”);

for (String part : parts) {

if (!part.isEmpty() && !“unknown”.equalsIgnoreCase(part)) {

ip = part.trim();

break;

}

}

}

if (“0:0:0:0:0:0:0:1”.equals(ip)) {

ip = “127.0.0.1”;

}

return ip;

}

这段代码与前面的代码基本一致,只是在最后多加了一些处理逻辑。如果上述方法获取的IP地址长度大于15,并且包含逗号,则从逗号之前截取IP地址。如果最终获取到的IP地址是"0:0:0:0:0:0:0:1",则将其转换为"127.0.0.1"。这些处理可以防止获取到的IP地址不完整或包含错误字符导致的问题。

注意事项

  1. 获取客户端IP地址的方法并非绝对可靠,因为代理服务器和负载均衡器等中间节点的设置和配置可能会导致IP地址被伪造或遗漏。
  2. 在一些场景中,我们需要对某些IP地址进行限制或认证,此时如果客户端使用了代理服务器,则可能需要使用代理服务器的IP地址或Header信息进行认证或限制。
  3. 在使用HttpServletRequest对象获取客户端IP地址的过程中,需要注意不要被恶意的Header参数所影响,可能需要进行安全的处理


标签:HttpServletRequest,请求,ip,request,获取,IP地址,客户端
From: https://blog.51cto.com/u_16270487/8261433

相关文章

  • tomcat 配置ip地址访问不用加端口和项目名
    主要配置tomcat/conf目录下的server.xml文件1、先找到8080端口,把端口改为80。<!--A"Connector"representsanendpointbywhichrequestsarereceivedandresponsesarereturned.Documentationat:JavaHTTPConnector:/docs/config/http.html(bl......
  • 快速定位连接oracle的客户端IP
    使用场景某些情况下,一些客户端上执行的程序性能有问题,或者程序中用户密码不对,重复登录造成用户被锁,这个时候都需要我们去定位有问题的客户端IP,然后进行处理。方案介绍一般情况下,快速定位客户端IP通畅有3种方法:创建触发器。该方法对生产系统还是有负担的,生产环境下一般不推荐,如果有......
  • 30张图详解IP地址网络知识
    你们好,我的网工朋友。IP地址是所有网络初级课程里最先涉及到的技术点,对于IP地址的合理规划是网络设计的重要环节,必须拿捏。IP地址规划的好坏,影响到网络路由协议算法的效率,影响到网络的性能,影响到网络的扩展,影响到网络的管理,也必将直接影响到网络应用的进一步发展。今天和你分享一篇......
  • 自己实现一个自动检测网卡状态,并设置ip地址,源码见文章底部
    阅读本文前,请先学习下面几篇文章《搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?》《简简单单教你如何用C语言列举当前所有网口!》《Linux下C语言操作网卡的几个代码实例!特别实用》《安卓如何设置开机自动启动某个程序?ramdisk+init.rc给你搞定》一、usb网卡应该如......
  • 代码随想训练营第二十八天(Python)| 93.复原IP地址 、 78.子集、 90.子集II
    93.复原IP地址1、方法一classSolution:defrestoreIpAddresses(self,s:str)->List[str]:res=[]self.tracebacking(s,0,[],res)returnresdeftracebacking(self,s,start,path,res):ifstart==len(s)andlen(pa......
  • js实现webSocket客户端
    var ws= new WebSocket("ws://localhost:8080/msg");//readyState属性返回实例对象的当前状态,共有四种。//CONNECTING:值为0,表示正在连接。//OPEN:值为1,表示连接成功,可以通信了。//CLOSING:值为2,表示连接正在关闭。//CLOSED:值为3,表示连接已经关闭,或者打开连接失败//例如:if......
  • Windows10 自动配置切换IP地址
    以下脚本保存为bat  @echooffrem//设置变量setNAME="KillerWireless"rem//以下属性值可以根据需要更改setADDR=192.168.1.203setMASK=255.255.255.0setGATEWAY=192.168.1.202setDNS1=192.168.1.202setDNS2=rem//以上属性依次为IP地址、子网掩码、网关、首选......
  • 1. 客户端代码执行流程
    目录1.GIT拉取客户端代码2.tf配置文件结构2.1backend.tf配置terraform状态文件存储在哪(localAWSS3...)2.2main.tfterraform入口文件2.3provider.tf配置terraform供应商2.4terraform.tfvars以及variables.tf配置变量2.5总结1.GIT拉取客户端代码https://wwwin-......
  • 正则表达式:IP地址和子网掩码
    #IP地址echoX.X.X.X|grep-E'^(22[0-3]|2[0-1][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}$'#子网掩码echoX.X.X.X|grep-E'^((255.255.255.(0|128|192|224|240|248|252|254|255))|(255.255.(0|128......
  • 职场小白必备知识点-IP地址
    什么是IP地址每个人都有自己的名字,电脑也一样。在本地,有主机名。在网络,有IP地址。首先,我们介绍一下“IP地址”:“IP地址”是“TCP/IP”(TransmiteControlProtocol传输控制协议/InternetProtocol网际协议)里其中的一种协议。不同的主机有不同的IP地址,每个主机的IP地址都是由32比......