我们知道在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;
}
分享到:
相关推荐
的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 ...
String remoteAddr = request.getRemoteAddr(); // ... } } ``` - **实现SessionAware接口**:如果希望在Action类中访问`session`对象,可以通过实现`SessionAware`接口来实现。在实现了这个接口后,STRUTS2...
String remoteAddr = request.getRemoteAddr(); ``` 10. **`getRealPath(String path)`**:获取服务器上指定资源的真实路径。 - 示例代码: ```java String realPath = request.getRealPath("request.jsp"); ...
String remoteAddr = request.getRemoteAddr(); // 客户机名称 String remoteHost = request.getRemoteHost(); // 请求端口 int remotePort = request.getRemotePort(); // 接收客户信息的页面 String ...
例如,常见用法可能是: if (rateLimitService.limit(request.remoteAddr + request.remotePort, 1000)) { def result = [error:'too fast yo!'] respond result return }这不会尝试进行锁定。 这意味着经过一定...
session.remoteAddr = (struct sockaddr*)&addr; AsnObject response; if (SnmpSendRecv(&session, &pdu, &response) != SNMPERR_SUCCESS) { // 错误处理 } char macAddress[18]; SnmpUtilOctsToA(mac...
${pageContext.request.remoteUser} 取得用户名称${pageContext.request.remoteAddr } 取得用户的IP 地址${pageContext.session.new} 判断session 是否为新的${pageContext.session.id} 取得session 的ID${...
- `${pageContext.request.method}`获取请求方法(GET、POST等)。 - `${pageContext.request.protocol}`获取协议版本(如HTTP/1.1)。 - `${pageContext.request.remoteUser}`获取远程用户名称。 - `${...
- **获取用户的IP地址**: `${pageContext.request.remoteAddr}` - **判断session是否为新创建**: `${pageContext.session.new}` - **获取session ID**: `${pageContext.session.id}` - **获取服务器信息**: `${...
${pageContext.request.remoteAddr} // 获取远程地址 ${pageContext.session.new} // 判断是否为新会话 ${pageContext.session.id} // 获取会话ID ${pageContext.servletContext.serverInfo} // 获取服务器信息 ...
- `${pageContext.request.remoteAddr}`获取客户端IP地址。 - `${pageContext.session.new}`判断会话是否为新创建。 - `${pageContext.session.id}`获取会话ID。 - `${pageContext.servletContext.serverInfo}`...
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 ...
RemoteAddr: 10.8.8.1:2786 Kubernetes 创建部署: export DEPLOY_NAME= " example " kubectl create deployment $DEPLOY_NAME --image=orginux/echopod 可选缩放: kubectl scale deployment $DEPLOY_NAME --...
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; ...
- 获取远程 IP 地址:`${pageContext.request.remoteAddr}` - 检查 session 是否新创建:`${pageContext.session.new}` - 获取 session ID:`${pageContext.session.id}` - 获取服务器信息:`${pageContext....
用法示例安装xff:转到get github.com/sebest/xff编辑server.go:打包主X-Forwarded-For中间件转到Go包xff是net / http中间件/处理程序,用于解析Golang中的Forwarded HTTP Extension。 用法示例安装xff:获取github...
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' . { ...
int sByte=sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr)); ``` recvfrom()函数用于接收数据,它的参数包括套接字、接收缓冲区、缓冲区大小、标志、发送方地址及地址长度。sendto()...
这个类会拦截每个HTTP请求,检查请求头中的`X-Forwarded-For`或`RemoteAddr`字段获取IP地址,然后与数据库中的IP列表进行比对。示例代码可能如下: ```java public class IPLimiter implements Filter { @...