获取访问者IP -- 基于Servlet方式

最近做一个小项目,需要在本地电脑上不断调试数据接口,但是由于用的是路由器上网,所以公网IP是不断变化的,这就很麻烦了,所以写一个小程序,每次返回访问者IP,没有技术难度,直接百度的哈哈,参考文章和源码链接见文末。

代码简介:

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。

  经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

所以可以用以下方法来获取访问者真正IP:

  可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实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

下面是项目部署好后的测试截图:

参考文章:

https://blog.csdn.net/starry7953810/article/details/79882285

https://blog.csdn.net/qq_36411874/article/details/79938439

源码下载地址:

https://gitee.com/jahero/ip

本文分享自微信公众号 - 浩Coding(gh_c4a2e63d2ca7)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习资料

Java多线程面试题及回答(详细总结)

  在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行...

18400
来自专栏阿杜的世界

024:用Java实现shell命令cat 1.log | grep a | sort | uniq -c | sort -rn的功能

artificial-intelligence-codes-coding-247791.jpg

17630
来自专栏慕容千语的架构笔记

从JVM角度看看Java的clone操作

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 最近在给熔断器组件增加一个降级策略(Hystri...

10820
来自专栏开发技术

Spring MVC的工作原理

  在关于利用maven搭建ssm的博客,我们一起来探讨下问的最多的问题中,我遗留了一个问题:Spring mvc是何时、何地、如何将Model中的属性绑定到哪...

17420
来自专栏Node开发

apidoc实现API文档自动生成

现在越来越流行前后端分离,使得前后端解耦。前后端的联系来源于数据接口,所以后端每次实现数据接口后都需要给前端写API接口文档,但是每次手写API...

1.4K70
来自专栏智慧协同

SpringBoot 统一时区的方案

思路为: 将数据库和服务器的时间都采用标准时区UTC存储处理。前端拿到标准时区的数据,统一根据用户所在时区进行转换。这样保证了后端数据时区的一致性,前端根据实...

39420
来自专栏happyJared

转发(forward)和重定向(redirect)的区别

转发(Forward) 是通过 RequestDispatcher 对象的 forward(HttpServletRequest request,HttpSer...

17240
来自专栏Java架构筑基

资深程序员总结:彻底理解Spring容器和应用上下文

有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期。业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协...

11300
来自专栏慕容千语的架构笔记

Java程序员进阶架构师的五个阶段,你到了哪各阶段?

之前有个讨论:实现同样功能,简洁代码一定比复杂代码效率高吗?有的说,还得看算法,如果算法相同,简洁代码效率应该会高一些。有的说,即使算法相同,简洁代码也不见得比...

14520
来自专栏Java技术栈

一个比Spring Boot快44倍的Java框架!

最近栈长看到一个框架,官方号称可以比 Spring Boot 快 44 倍,居然这么牛逼,有这么神奇吗?今天带大家来认识一下。 这个框架名叫:light-4...

14930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励