`

get request remoteAddr

    博客分类:
  • J2EE
阅读更多

    我们知道在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地址的方法一:

public String getRemortIP(HttpServletRequest request) {  
    if (request.getHeader("x-forwarded-for") == null) {  
        return request.getRemoteAddr();  
    }  
    return request.getHeader("x-forwarded-for");  
}  


   获得客户端真实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)) {  
        ip = request.getRemoteAddr();  
    }  
    return 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
     通过以上方法可以得到网页浏览者的真实IP地址。

 

 

-------------------------------------------------------------------------------------------------------------------------

 

    private String findClient_IPAddr() {
        HttpServletRequest request = ServletActionContext.getRequest();
        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)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

分享到:
评论

相关推荐

    gin-gonic-realip:Gin的Real IP中间件将http.Request的RemoteAddr设置为解析X-Forwarded-For标头或X-Real-IP标头的结果

    的Real IP中间件,将http.Request的RemoteAddr设置为解析X-Forwarded-For标头或X-Real-IP标头的结果。 用法 package main import ( "github.com/gin-gonic/gin" "github.com/thanhhh/gin-gonic-realip" ) func ...

    STRUTS2获得session和request

    String remoteAddr = request.getRemoteAddr(); // ... } } ``` - **实现SessionAware接口**:如果希望在Action类中访问`session`对象,可以通过实现`SessionAware`接口来实现。在实现了这个接口后,STRUTS2...

    JSP的request对象实例详解

    String remoteAddr = request.getRemoteAddr(); ``` 10. **`getRealPath(String path)`**:获取服务器上指定资源的真实路径。 - 示例代码: ```java String realPath = request.getRealPath("request.jsp"); ...

    JSP 9大内置对象学习总结

    String remoteAddr = request.getRemoteAddr(); // 客户机名称 String remoteHost = request.getRemoteHost(); // 请求端口 int remotePort = request.getRemotePort(); // 接收客户信息的页面 String ...

    grails-ratelimit:简单的基于价值的限速插件

    例如,常见用法可能是: if (rateLimitService.limit(request.remoteAddr + request.remotePort, 1000)) { def result = [error:'too fast yo!'] respond result return }这不会尝试进行锁定。 这意味着经过一定...

    获得网卡MAC地址 Get MAC Address, SNMP Method

    session.remoteAddr = (struct sockaddr*)&addr; AsnObject response; if (SnmpSendRecv(&session, &pdu, &response) != SNMPERR_SUCCESS) { // 错误处理 } char macAddress[18]; SnmpUtilOctsToA(mac...

    JSTL高级用法

    ${pageContext.request.remoteUser} 取得用户名称${pageContext.request.remoteAddr } 取得用户的IP 地址${pageContext.session.new} 判断session 是否为新的${pageContext.session.id} 取得session 的ID${...

    el表达式用法部分解说

    - `${pageContext.request.method}`获取请求方法(GET、POST等)。 - `${pageContext.request.protocol}`获取协议版本(如HTTP/1.1)。 - `${pageContext.request.remoteUser}`获取远程用户名称。 - `${...

    Java-EL表达式语言讲解,适合初级人员入门学习

    - **获取用户的IP地址**: `${pageContext.request.remoteAddr}` - **判断session是否为新创建**: `${pageContext.session.new}` - **获取session ID**: `${pageContext.session.id}` - **获取服务器信息**: `${...

    EL与JSP相关内置对象

    ${pageContext.request.remoteAddr} // 获取远程地址 ${pageContext.session.new} // 判断是否为新会话 ${pageContext.session.id} // 获取会话ID ${pageContext.servletContext.serverInfo} // 获取服务器信息 ...

    EL语言介绍.txt

    - `${pageContext.request.remoteAddr}`获取客户端IP地址。 - `${pageContext.session.new}`判断会话是否为新创建。 - `${pageContext.session.id}`获取会话ID。 - `${pageContext.servletContext.serverInfo}`...

    springboot如何使用AOP做访问请求日志

    HttpServletRequest request = servletRequestAttributes.getRequest(); String requestURI = request.getRequestURI(); String method = request.getMethod(); String remoteAddr = request.getRemoteAddr(); ...

    实现异地上传

    String remoteAddr = request.getRemoteAddr(); // 获取服务器名称 String serverName = request.getServerName(); // 获取服务器的实际路径 String realPath = request.getRealPath(serverName); realPath ...

    echopod:提供有关containerpod信息的最小HTTP服务器

    RemoteAddr: 10.8.8.1:2786 Kubernetes 创建部署: export DEPLOY_NAME= " example " kubectl create deployment $DEPLOY_NAME --image=orginux/echopod 可选缩放: kubectl scale deployment $DEPLOY_NAME --...

    关于ip的过滤器 spring security例子

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; ...

    el表达式教程-独家传播

    - 获取远程 IP 地址:`${pageContext.request.remoteAddr}` - 检查 session 是否新创建:`${pageContext.session.new}` - 获取 session ID:`${pageContext.session.id}` - 获取服务器信息:`${pageContext....

    Golang中间件,用于处理X-Forwarded-For标头-Golang开发

    用法示例安装xff:转到get github.com/sebest/xff编辑server.go:打包主X-Forwarded-For中间件转到Go包xff是net / http中间件/处理程序,用于解析Golang中的Forwarded HTTP Extension。 用法示例安装xff:获取github...

    rocket-tutorial:火箭教程

    log.Printf("request from %v\n", r.RemoteAddr) w.Write([]byte("hello\n")) }) log.Fatal(http.ListenAndServe(":5000", nil)) } CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' . { ...

    UDP客户端与服务器端echo简单案例

    int sByte=sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr)); ``` recvfrom()函数用于接收数据,它的参数包括套接字、接收缓冲区、缓冲区大小、标志、发送方地址及地址长度。sendto()...

    ip黑白名单拦截器java示例

    这个类会拦截每个HTTP请求,检查请求头中的`X-Forwarded-For`或`RemoteAddr`字段获取IP地址,然后与数据库中的IP列表进行比对。示例代码可能如下: ```java public class IPLimiter implements Filter { @...

Global site tag (gtag.js) - Google Analytics