【发布时间】:2015-04-27 13:56:47
【问题描述】:
当客户端向 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 一样?有没有其他方法可以提取端口?
我不能使用任何外部服务来解析这些数据,这就是为什么我必须制作自己的 servlet。
【问题讨论】:
标签: java spring http httprequest port