作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当客户端向 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.1
或 0: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/
我是一名优秀的程序员,十分优秀!