strut2拦截器之获取客户端IP

下面是获取客户端iP的代码: 首先自定义一个拦截器
 1 @Override
 2 public String intercept(ActionInvocation ai) throws Exception {
 3   ActionContext invocationContext = ai.getInvocationContext();
 4   HttpServletRequest httpservletrequest= (HttpServletRequest) invocationContext.get(StrutsStatics.HTTP_REQUEST);
 5
 6   String s = httpservletrequest.getHeader("X-Forwarded-For");
 7   if (s == null || s.length() == 0 || "unknown".equalsIgnoreCase(s))  s = httpservletrequest.getHeader("Proxy-Client-IP");
 9   if (s == null || s.length() == 0 || "unknown".equalsIgnoreCase(s))  s = httpservletrequest.getHeader("WL-Proxy-Client-IP");
11   if (s == null || s.length() == 0 || "unknown".equalsIgnoreCase(s))  s = httpservletrequest.getHeader("HTTP_CLIENT_IP");
13   if (s == null || s.length() == 0 || "unknown".equalsIgnoreCase(s))  s = httpservletrequest.getHeader("HTTP_X_FORWARDED_FOR");
15   if (s == null || s.length() == 0 || "unknown".equalsIgnoreCase(s))  s = httpservletrequest.getRemoteAddr();
17   if ("127.0.0.1".equals(s) || "0:0:0:0:0:0:0:1".equals(s)) {
18     try {
19         s = InetAddress.getLocalHost().getHostAddress();
20      }21      catch (UnknownHostException unknownhostexception) {
22     }     }
23   System.out.println(s);
24   return null;  }

首先要明白几个名词:

x-forwarded-for: 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,格式标准为 X-Forwarded-For: client1, proxy1, proxy2
Proxy-Client-IP和 WL-Proxy-Client-IP:
  只在 Apache(Weblogic Plug-In Enable)+WebLogic 搭配下出现,仅仅是兼容而已,怕你突然把 Nginx+Resin 换成 Apache+WebLogic 
HTTP_CLIENT_IP: 代表客户端的ip,是代理服务器发送的HTTP头 , 可通过http头伪造
HTTP_X_FORWARDED_FOR: 代表当前页面的用户计算机的网关, 是X_FORWARDED_FOR的一个属性,可通过http头伪造
REMOTE_ADDR:当前页面的用户计算机的ip地址,,可能是用户真实IP也可能是代理IP
以下的问题要明白:

  为什么ip会是0:0:0:0:0:0:0:1 ?    是由于服务器和客户端都在同一台电脑上才会出现这种情况    window下打开C:\Windows\system32\drivers\etc\ hosts这个文件, 取消 127.0.0.1     localhost这一行的注释

  当请求经过了多个反向代理服务器之后,如何取客户端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      可通过以下代码获取
       if (ip != null && ip.indexOf(",") != -1) {            ip = ip.substring(ip.lastIndexOf(",") + 1, ip.length()).trim();          }  

 

 
时间: 2024-10-16 05:56:48

strut2拦截器之获取客户端IP的相关文章

php获取客户端IP

从Onethink代码里摘出来的 /**  * 获取客户端IP地址  * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字  * @return mixed  */ function get_client_ip($type = 0) {     $type       =  $type ? 1 : 0;     static $ip  =   NULL;     if ($ip !== NULL) return $ip[$type];     if 

php 获取客户端ip

1 function getRealIp() { 2 if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 3 $ip = getenv("HTTP_CLIENT_IP"); 4 else if (getenv("HTTP_X_FORWARDED_FOR") && st

再论 ASP.NET 中获取客户端IP地址

说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分区域投放等. 1: HttpContext.Current.Request.ServerVariables["HTTP_VIA"]; 2: HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"

性能优化之——.NET(C#)调用webService获取客户端IP地址所属区域(异步回调)(二)

朋友们这次分享的是异步回调不是异步调用哦! 请注意喽! 功能描述,接口地址,方法名称以及参数说明,同上篇:.NET(C#)调用webService获取客户端IP地址所属区域(非异步)(一)(LZ比较懒,不想写太多哦!(⊙0⊙)) 实现代码如下: 1 namespace main 2 { 3 class Program 4 { 5 public static string Result = string.Empty; 6 7 static void Main(string[] args) 8 {

Netty4.X 获取客户端IP

最近使用netty-4.0.23.Final 版本编写服务端代码,有个获取客户端代码的小需求,以前使用servlet开发时很机械的就: String ipAddr="0.0.0.0"; if (reqest.getHeader("X-Forwarded-For") == null) {     ipAddr = reqest.getRemoteAddr();  }else{          ipAddr = req.getHeader("X-Forwar

.net 获取客户端Ip地址

Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址. 要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables["HTTP_X_FORWARDED_FOR"]来读取. 不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables["HTTP

C#服务器获取客户端IP地址以及归属地探秘

背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解.一日老婆逛完某宝,问:"为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?" 顺着这个问题我们的探秘开始: 第一步:简单的服务搭建 思路,通过HttpListener在本地搭建一个简易的服务器,开发程序为控制台接口,核心类 HttpListenerService: 方法 Start()开启线程池针对指定IP进行监听,本地的端口选取的9527(周星驰唐伯虎点秋香在华府的编号)  public void Sta

Mina获取客户端IP地址问题

使用Mina做Socket通信时,服务器端获取客户端IP地址,其实很简单,代码如下: @Override public void messageReceived(IoSession session, Object message) throws Exception { String clientIP = ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress(); } 但是有时候却发现,session

java获取客户端IP地址和MAC地址

最近项目中要获得客户端的mac地址.服务端是移植的centos系统,arm架构的盒子.客户端是手机和移动设备.(其它场景应该也是类似的) 首先要获得ip地址: 根据客户端的http请求,利用request.getRemoteAddr()获取客户端Ip地址.在局域网内getRemoteAddr()和getRemoteHost()获得的结果相同.request.getRemoteAddr()是获得客户端的ip地址 .getRemoteHost()是获得客户端的主机名 .在有些场景中,可能有Squid