我们在做项目的时候经常需要获取客户端的真实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类:

[java] view plain copy

 
 
  1. /**
  2. * 常用获取客户端信息的工具
  3. *
  4. */
  5. public final class NetworkUtil {
  6. /**
  7. * Logger for this class
  8. */
  9. private static Logger logger = Logger.getLogger(RandomCodeUtils.class);
  10. /**
  11. * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
  12. *
  13. * @param request
  14. * @return
  15. * @throws IOException
  16. */
  17. public final static String getIpAddress(HttpServletRequest request) throws IOException {
  18. // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
  19. String ip = request.getHeader("X-Forwarded-For");
  20. if (logger.isInfoEnabled()) {
  21. logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
  22. }
  23. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  24. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  25. ip = request.getHeader("Proxy-Client-IP");
  26. if (logger.isInfoEnabled()) {
  27. logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
  28. }
  29. }
  30. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  31. ip = request.getHeader("WL-Proxy-Client-IP");
  32. if (logger.isInfoEnabled()) {
  33. logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
  34. }
  35. }
  36. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  37. ip = request.getHeader("HTTP_CLIENT_IP");
  38. if (logger.isInfoEnabled()) {
  39. logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
  40. }
  41. }
  42. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  43. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  44. if (logger.isInfoEnabled()) {
  45. logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
  46. }
  47. }
  48. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  49. ip = request.getRemoteAddr();
  50. if (logger.isInfoEnabled()) {
  51. logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
  52. }
  53. }
  54. } else if (ip.length() > 15) {
  55. String[] ips = ip.split(",");
  56. for (int index = 0; index < ips.length; index++) {
  57. String strIp = (String) ips[index];
  58. if (!("unknown".equalsIgnoreCase(strIp))) {
  59. ip = strIp;
  60. break;
  61. }
  62. }
  63. }
  64. return ip;
  65. }
  66. }

最新文章

  1. 2. K线学习知识二
  2. bzoj1491 社交网络
  3. 模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)
  4. 理解和使用 JavaScript 中的回调函数
  5. Performance Analyzer Tool
  6. python 中的input
  7. 【转】IOS中各种常用控件的默认高度,很全
  8. 《foreach循环示例》
  9. Linux下设置定期执行脚本
  10. Java的位运算符实例——与(&amp;)、非(~)、或(|)、异或(^)
  11. 关于新装ubuntu系统update失败和build-essential失败的解决办法
  12. canvas烟花-娱乐
  13. HTML特殊字符编码对照表(备记)
  14. 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)
  15. wxWidgets:给窗口添加工具条
  16. Oracle完全卸载
  17. rocketmq技术架构图
  18. 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活动结果时候 回调 是否被执行?
  19. Mongo 查询
  20. 进程(并发,并行) join start 进程池 (同步异步)

热门文章

  1. FTPClient下载文件,程序假死问题
  2. [经验] Cocos Creator使用笔记 --- 俄罗斯方块 (1)
  3. 在 Scale Up 中使用 Health Check【转】
  4. 查看 Secret【转】
  5. 杭电oj1860:统计字符(字符串hash / 水题)
  6. 009.CI4框架CodeIgniter, 网页访问GET的URL参数获取,分段输出URL参数
  7. 图片与byte相互转换
  8. spark源码单步跟踪阅读-从毛片说起
  9. mysql8 安装&amp;问题解决
  10. @Resource 和@Autowired区别