如何在 spring servlet 中获取远程 HTTP 端口号?
How to get remote HTTP Port number in spring servlet?
当客户端向servlet发出请求时,我需要提取客户端的IP和端口号。
这是我的控制器代码:
@Controller
public class IpCheckerController {
String ip;
@ResponseBody
@RequestMapping(value = "/ipchecker", method = RequestMethod.GET)
public String get(HttpServletRequest request, HttpServletResponse response) throws IOException {
for (String header : HEADERS_TO_TRY) {
ip = request.getHeader(header);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
return ip + "_"+request.getRemotePort(); // this port is wrong
// but I left it here for now.
}
}
return request.getRemoteAddr() + "_"+request.getRemotePort();
}
private static final String[] HEADERS_TO_TRY = {
"X-Forwarded-For",
"Proxy-Client-IP",
"WL-Proxy-Client-IP",
"HTTP_X_FORWARDED_FOR",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"HTTP_VIA",
"REMOTE_ADDR" };
}
但是它没有按预期工作。起初我使用 getRemoteAddr()
但它 alays returns 127.0.0.1
或 0:0:0:0:0:0:0:1
。然后我从工作人员那里得到了这段代码,检查了不同的 headers,现在它工作正常。
但是getRemotePort()
returns错误的端口。我的应用程序根据我在登录时放入数据库的 ip 和端口对用户进行身份验证。当有人进行未经授权的尝试时,记录器会记下进行尝试的 IP 和端口。此端口始终与 getRemotePort()
显示的不同。
我可以使用什么 headers 来像获取 IP 一样获取端口?是否有其他提取端口的方法?
我不能使用任何外部服务来解析这些数据,这就是我必须制作自己的 servlet 的原因。
不同连接的端口地址会有所不同。
这是一个 post 解释:
无法避免客户端端口发生变化,这是由于路由器在其网络内部处理路由流量的方式所致。基本上每次本地网络内部的某个人向外界发出请求时,路由器都会为该特定请求分配一个随机的高端口。这就是您可以让多个人在一个网络上从一个 IP 地址发出不同的 http 请求的方式。
当客户端向servlet发出请求时,我需要提取客户端的IP和端口号。
这是我的控制器代码:
@Controller
public class IpCheckerController {
String ip;
@ResponseBody
@RequestMapping(value = "/ipchecker", method = RequestMethod.GET)
public String get(HttpServletRequest request, HttpServletResponse response) throws IOException {
for (String header : HEADERS_TO_TRY) {
ip = request.getHeader(header);
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
return ip + "_"+request.getRemotePort(); // this port is wrong
// but I left it here for now.
}
}
return request.getRemoteAddr() + "_"+request.getRemotePort();
}
private static final String[] HEADERS_TO_TRY = {
"X-Forwarded-For",
"Proxy-Client-IP",
"WL-Proxy-Client-IP",
"HTTP_X_FORWARDED_FOR",
"HTTP_X_FORWARDED",
"HTTP_X_CLUSTER_CLIENT_IP",
"HTTP_CLIENT_IP",
"HTTP_FORWARDED_FOR",
"HTTP_FORWARDED",
"HTTP_VIA",
"REMOTE_ADDR" };
}
但是它没有按预期工作。起初我使用 getRemoteAddr()
但它 alays returns 127.0.0.1
或 0:0:0:0:0:0:0:1
。然后我从工作人员那里得到了这段代码,检查了不同的 headers,现在它工作正常。
但是getRemotePort()
returns错误的端口。我的应用程序根据我在登录时放入数据库的 ip 和端口对用户进行身份验证。当有人进行未经授权的尝试时,记录器会记下进行尝试的 IP 和端口。此端口始终与 getRemotePort()
显示的不同。
我可以使用什么 headers 来像获取 IP 一样获取端口?是否有其他提取端口的方法?
我不能使用任何外部服务来解析这些数据,这就是我必须制作自己的 servlet 的原因。
不同连接的端口地址会有所不同。
这是一个 post 解释:
无法避免客户端端口发生变化,这是由于路由器在其网络内部处理路由流量的方式所致。基本上每次本地网络内部的某个人向外界发出请求时,路由器都会为该特定请求分配一个随机的高端口。这就是您可以让多个人在一个网络上从一个 IP 地址发出不同的 http 请求的方式。