gpt4 book ai didi

java - 如何在Spring Servlet中获取远程HTTP端口号?

转载 作者:行者123 更新时间:2023-12-01 22:26:18 25 4
gpt4 key购买 nike

当客户端向 servlet 发出请求时,我需要提取客户端的 IP 和端口号。

这是我的 Controller 代码:

@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 >。然后我从工作人员那里得到了这段代码,检查了不同的 header ,现在它可以正常工作了。

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

我可以使用哪些 header 来获取端口,就像获取 IP 一样?有其他方法提取端口吗?

我无法使用任何外部服务来解析这些数据,这就是为什么我必须制作自己的 servlet。

最佳答案

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

关于java - 如何在Spring Servlet中获取远程HTTP端口号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com