我需要在向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()
,但它会返回127.0.0.1
或0:0:0:0:0:0:0:1
。然后我从工作中的某个人那里获得了这个代码,检查了不同的标题,现在它正常工作。
然而getRemotePort()
返回错误的端口。我的应用程序根据登录时放入数据库的ip和端口对用户进行身份验证。当有人进行和未经授权的尝试时,记录器会记下进行尝试的IP和端口。此端口始终与getRemotePort()
显示的不同。
我可以使用哪些标头来获取端口,就像使用IP一样?是否有不同的方法来提取端口?
我无法使用任何extrernal服务来解析这些数据,这就是我必须创建自己的servlet的原因。
答案 0 :(得分:2)
无法避免客户端端口发生更改,这是由于路由器在其网络内部处理路由流量的方式。基本上,每当有人在本地网络内部向外界发出请求时,路由器就会为该特定请求分配一个随机高端口。这就是如何让一个网络上的多个人从一个IP地址发出不同的http请求。
答案 1 :(得分:1)
端口地址因不同的连接而异。
这是一篇解释此内容的帖子:HttpServletRequest.getRemotePort() returns different port per http request received on same machine?