java服务端获取客户端ip(代理)

在没有 关或者反向代理软件情况下,java里获取客户端ip地址的方法是request.getRemoteAddr() 先解释下http协议和TCP协议: 由上面可以知道request.getRemoteAddr()方法其实就是获取的连接的客户端socket的ip地址。   但如果我们客户端将要发送接口请求先发送到一台代理请求服务器或者 关后,再由他们进行数据请求, 这时我们使用上面的getRemoteAddr()方法获取到了ip地址就是代理请求服务器或 关的ip地址。 而不是真实的客户端ip地址 也就是说通过nginx等反向代理软件时,不能通过这个方法获取客户端真是ip地址。  

对应java方法来说,request.getRemoteAddr(),因为直接请求的客户端是nginx,在同一服务器上,所以这个方法获取到的ip地址是127.0.0.1或者193.112.28.110

  要获取真实ip地址就要使用request.getHeader(“x-forwarded-for”)获取请求头部真实ip地址 ,但是当xxx.conf配置server节点时,forwarded_for设置为off,则X-Forwarded-For:unknown 默认forwarded_for是on   先看下nginx的部分配置

src=”//common.cnblogs.com/images/copycode.gif” alt=“复制代码”>

继续使用上面数据

这个$host 其实是nginx服务器本身的ip地址:193.112.28.110  $remote_addr这个地址是想nginx请求的客户端地址:223.104.1.240  $proxy_add_x_forwarded_for 这个变量和remote_addr的区别是 proxy_add_x_forwarded_for会将经过的所有代理ip相加起来, remote_addr则只是获取到直接连接到nginx的ip地址

 

简单了方法

上面三个请求头,大部分的代理或者 关都会加上x-forwarded-for:clientip,proxy1ip,proxy2ip

Proxy-Client-IP这个一般是apache,http服务器才会有,经过apache代理时,apache会在请求头加上x-forwarded-for和Proxy-Client-IP

WL-Proxy-Client-IP这个一般是weblogic才会加上的头部

注意:

1、这些请求头都不是http协议里的标准请求头,也就是说这个是各个代理服务器自己规定的表示客户端地址的请求头。如果哪天有一个代理服务器软件用oooo-client-ip这个请求头代表客户端请求,那上面的代码就不行了。

2、这些请求头不是代理服务器一定会带上的, 络上的很多匿名代理就没有这些请求头,所以获取到的客户端ip不一定是真实的客户端ip。代理服务器一般都可以自定义请求头设置。

3、即使请求经过的代理都会按自己的规范附上代理请求头,上面的代码也不能确保获得的一定是客户端ip。不同的 络架构,判断请求头的顺序是不一样的。

4、最重要的一点,请求头都是可以伪造的。如果一些对客户端校验较严格的应用(比如投票)要获取客户端ip,应该直接使用ip = request.getRemoteAddr (),虽然获取到的可能是代理的ip而不是客户端的ip,但这个获取到的ip基本上是不可能伪造的,也就杜绝了刷票的可能。(有分析说arp欺骗+syn有可能伪造此ip,如果真的可以,这是所有基于TCP协议都存在的漏洞),这个ip是tcp连接里的ip。
IP工具类 import javax.servlet.http.HttpServletRequest; /** * IP地址工具类 * @author xudongdong * */ public class IpUtil {

}

文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树首页概览22976 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月16日
下一篇 2021年1月16日

相关推荐