Java获取HttpServletRequest真实的调用ip
发布时间:2025-05-19 17:42:04 发布人:远客网络
一、Java获取HttpServletRequest真实的调用ip
获取真实的HTTP请求调用IP,面临多种挑战,尤其是面对代理、反向代理以及代理请求头标准的缺失。本文总结了目前可行的、较为全面且通用的方法。
真实调用的IP,通常不应为内网IP,需考虑客户端多样性。我们从通用Header出发,同时考虑到各种常见客户端自定义Header。有效IP范围为1.0.0.0~255.255.255.255。通过正则表达式或分段判断验证IP有效性。分段判断方法在性能上表现较好,适用于实际应用。
验证IP为非内网IP时,基于已验证有效的IP基础上,可采用三种方法:直接验证IP段、检查是否为本地回环地址或根据网络配置判断。这些方法在实际应用中简化了判断过程。
获取IP时,首先应检查可能的HTTP Header,如X-Forwarded-For、X-Real-IP、X-Client-IP等(不区分大小写)。这些Header提供了额外信息,用于获取真实的客户端IP。若上述Header均未提供所需信息,最后考虑从RemoteAddress获取IP,作为最后的尝试手段。
二、java中怎么获取客户端的真实的IP-CSDN论坛
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将:2046/的URL反向代理为 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问:2046/index.jsp,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request){
if(request.getHeader("x-forwarded-for")== null){
return request.getRemoteAddr();
return request.getHeader("x-forwarded-for");
可是当我访问时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1或192.168.1.110了,而我访问:2046/index.jsp时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf的配制文件forwarded_for项默认是为on,如果 forwarded_for设成了 off则:X-Forwarded-For: unknown
于是可得出获得客户端真实IP地址的方法二:
public String getIpAddr(HttpServletRequest request){
String ip= request.getHeader("x-forwarded-for");
if(ip== null|| ip.length()== 0||"unknown".equalsIgnoreCase(ip)){
ip= request.getHeader("Proxy-Client-IP");
if(ip== null|| ip.length()== 0||"unknown".equalsIgnoreCase(ip)){
ip= request.getHeader("WL-Proxy-Client-IP");
if(ip== null|| ip.length()== 0||"unknown".equalsIgnoreCase(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
更多Java精彩课程请点击:
三、java中如何获取到本机的外网ip地址
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
*思想是访问网站,得到返回的文本后解析出本机在外网的IP地址
public class ExternalIpAddressFetcher{
private String externalIpProviderUrl;
private String myExternalIpAddress;
public ExternalIpAddressFetcher(String externalIpProviderUrl){
this.externalIpProviderUrl= externalIpProviderUrl;
String returnedhtml= fetchExternalIpProviderHTML(externalIpProviderUrl);
*从外网提供者处获得包含本机外网地址的字符串
*从返回的字符串如下
*<html><head><title>Current IP Check</title></head><body>Current IP Address: 123.147.226.222</body></html>
private String fetchExternalIpProviderHTML(String externalIpProviderUrl){
HttpURLConnection httpConn= null;
URL url= new URL(externalIpProviderUrl);
httpConn=(HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.setRequestProperty("User-Agent",
"Mozilla/4.0(compatible; MSIE 6.0; Windows 2000)");
in= httpConn.getInputStream();
byte[] bytes=new byte[1024];//此大小可根据实际情况调整
while(offset< bytes.length
&&(numRead=in.read(bytes, offset, bytes.length-offset))>= 0){
String receivedString=new String(bytes,"UTF-8");
} catch(MalformedURLException e){
*使用正则表达式解析返回的HTML文本,得到本机外网地址
private void parse(String html){
Pattern pattern=Pattern.compile("(\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})", Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(html);
myExternalIpAddress=matcher.group(0);
*得到本机外网地址,得不到则为空
public String getMyExternalIpAddress(){
public static void main(String[] args){
ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher("");
System.out.println(fetcher.getMyExternalIpAddress());