如何在 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.10:0:0:0:0:0:0:1。然后我从工作人员那里得到了这段代码,检查了不同的 headers,现在它工作正常。

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

我可以使用什么 headers 来像获取 IP 一样获取端口?是否有其他提取端口的方法?

我不能使用任何外部服务来解析这些数据,这就是我必须制作自己的 servlet 的原因。

不同连接的端口地址会有所不同。

这是一个 post 解释:

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