在互联网应用中,为了提高访问速度和稳定性,通常会使用内容分发网络(CDN)来缓存静态资源,当客户端请求到达CDN节点后,源IP地址会被CDN节点的IP地址所代替,导致后端服务器无法获取到真实的客户端IP地址,如何获取真实源IP成为了许多Java开发者面临的问题。
本文将介绍几种常用的方法来获取真实源IP,包括HTTP头部信息、反向代理服务器、JavaScript等。
1. HTTP头部信息
HTTP协议定义了一些头部字段用于传递客户端和服务器之间的信息。XForwardedFor
和XRealIP
是最常用的两个头部字段,用于标识客户端的真实IP地址。
1.1 XForwardedFor头部字段
XForwardedFor
头部字段是一个由逗号分隔的IP地址列表,表示客户端的真实IP地址以及经过的所有代理服务器的IP地址,如果客户端直接连接到服务器,则该字段只包含客户端的IP地址;如果客户端通过代理服务器连接,则该字段包含客户端的IP地址和代理服务器的IP地址。
在Java中,可以通过HttpServletRequest对象的getHeader()
方法获取XForwardedFor
头部字段的值,示例代码如下:
String ipAddress = request.getHeader("XForwardedFor"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); }
1.2 XRealIP头部字段
XRealIP
头部字段表示客户端的真实IP地址,无论是否经过代理服务器,与XForwardedFor
不同,XRealIP
只包含一个IP地址。
在Java中,可以通过HttpServletRequest对象的getHeader()
方法获取XRealIP
头部字段的值,示例代码如下:
String ipAddress = request.getHeader("XRealIP"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); }
2. 反向代理服务器
反向代理服务器是位于客户端和服务器之间的中间层,用于转发客户端的请求到服务器,并将服务器的响应返回给客户端,常见的反向代理服务器有Nginx、Apache等。
2.1 Nginx反向代理服务器
在Nginx中,可以通过配置文件设置proxy_set_header
指令来传递真实源IP地址,示例配置如下:
location / { proxy_pass http://backend; proxy_set_header XRealIP $remote_addr; proxy_set_header XForwardedFor $proxy_add_x_forwarded_for; }
在Java中,可以通过HttpServletRequest对象的getHeader()
方法获取XRealIP
和XForwardedFor
头部字段的值,示例代码如下:
String ipAddress = request.getHeader("XRealIP"); if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getHeader("XForwardedFor"); } if (ipAddress == null || ipAddress.isEmpty()) { ipAddress = request.getRemoteAddr(); }
2.2 Apache反向代理服务器
在Apache中,可以通过配置文件设置ProxyPassReverseCookieDomain
指令来传递真实源IP地址,示例配置如下:
<VirtualHost *:80> ServerName example.com ProxyPass / http://backend/ retry=0 keepalive=On timeout=600 persistent=On proxyerrortimeout=10000 cookiedomain=.example.com appendonly=On proxysetheader=XRealIP %{REMOTE_ADDR}e setenv=proxyuseglobalcache on enablerewrite=On rewritecond=%{REQUEST_URI}::$1|^/(images/|javascript/|css/|download/|robots.txt) [L] rewriterule=^([^/]+)/[^/]+/(.*)$ http://backend/$1/$2 [P] loglevel=debug:access_log enablefilters=all vhost_trafficstatus_enable=On vhost_trafficstatus_reverse_proxy=On vhost_trafficstatus_display_vhosts=default vhost_trafficstatus_redirect=Off vhost_trafficstatus_module=mod_vhost_trafficstatus vhost_trafficstatus_config="VHostTrafficStatus:backend" cookiename=proxycookie path=/ httponly secure if=$http_cookie_proxycookie!~*^(.*;\s?)?\d+(\.\d+)?$ [R,E=PROXY_USE_GLOBAL_CACHE:1] unsetenv=proxyuseglobalcache env=proxyuseglobalcache value=1 userequestheaders=On proxysetheader=XRealIP %{REMOTE_ADDR}e proxypassreversecookiedomain=.example.com proxypassreversepathinfo=On proxypassrecursionlimit=5 rewritemaplowercasefilemapprg:/usr/local/apache2/bin/mod_rpaf.so rewritemaplowercaseparam:$1|^/(images/|javascript/|css/|download/|robots.txt) [L] rewriterule=^([^/]+)/[^/]+/(.*)$ http://backend/$1/$2 [P] loglevel=debug:access_log enablefilters=all vhost_trafficstatus_enable=On vhost_trafficstatus_reverse_proxy=On vhost_trafficstatus_display_vhosts=default vhost_trafficstatus_redirect=Off vhost_trafficstatus_module=mod_vhost_trafficstatus vhost_trafficstatus_config="VHostTrafficStatus:backend" cookiename=proxycookie path=/ httponly secure if=$http_cookie_proxycookie!~*^(.*;\s?)?\d+(\.\d+)?$ [R,E=PROXY_USE_GLOBAL_CACHE:1] unsetenv=proxyuseglobalcache env=proxyuseglobalcache value=1 userequestheaders=On proxysetheader=XRealIP %{REMOTE_ADDR}e proxypassreversecookiedomain=.example.com proxypassreversepathinfo=On proxypassrecursionlimit=5 rewritemaplowercasefilemapprg:/usr/local/apache2/bin/mod_rpaf.so rewritemaplowercaseparam:$1|^/(images/|javascript/|css/|download/|robots.txt) [L] rewriterule=^([^/]+)/[^/]+/(.*)$ http://backend/$1/$2 [P] loglevel=debug:access_log enablefilters=all vhost_trafficstatus_enable=On vhost_trafficstatus_reverse_proxy=On vhost_trafficstatus_display_vhosts=default vhost_trafficstatus_redirect=Off vhost_traffec
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/547501.html