如何在spring servlet中获取远程HTTP端口号?

时间:2015-02-25 14:15:57

标签: java spring http httprequest port

我需要在向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.10:0:0:0:0:0:0:1。然后我从工作中的某个人那里获得了这个代码,检查了不同的标题,现在它正常工作。

然而getRemotePort()返回错误的端口。我的应用程序根据登录时放入数据库的ip和端口对用户进行身份验证。当有人进行和未经授权的尝试时,记录器会记下进行尝试的IP和端口。此端口始终与getRemotePort()显示的不同。

我可以使用哪些标头来获取端口,就像使用IP一样?是否有不同的方法来提取端口?

我无法使用任何extrernal服务来解析这些数据,这就是我必须创建自己的servlet的原因。

2 个答案:

答案 0 :(得分:2)

无法避免客户端端口发生更改,这是由于路由器在其网络内部处理路由流量的方式。基本上,每当有人在本地网络内部向外界发出请求时,路由器就会为该特定请求分配一个随机高端口。这就是如何让一个网络上的多个人从一个IP地址发出不同的http请求。

答案 1 :(得分:1)

端口地址因不同的连接而异。

这是一篇解释此内容的帖子:HttpServletRequest.getRemotePort() returns different port per http request received on same machine?