java后台如何识别客户端真实ip可能经过代理伪装nginx转发等多重改写?具体代码实现
在Java后台中,可以使用以下方法来识别客户端真实IP,即使经过代理伪装或Nginx转发等多重改写:
- 使用
HttpServletRequest对象获取请求头中的X-Forwarded-For头字段值。该字段通常由代理服务器或负载均衡器添加,包含了客户端真实IP和经过的代理IP。但是需要注意的是,由于该字段可以被客户端伪造,所以需要进行一些验证。
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
- 使用
X-Real-IP头字段。该字段由Nginx服务器添加,也包含了客户端真实IP。同样需要进行验证。
String ipAddress = request.getHeader("X-Real-IP");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
- 如果你在Java后台使用了Spring框架,可以使用
@RequestHeader注解获取请求头字段值。
@RequestMapping("/example")
public String exampleMethod(@RequestHeader(value="X-Forwarded-For", required=false) String ipAddress) {
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
// ...
}
需要注意的是,以上方法并不是绝对可靠,因为客户端IP可以被伪造或隐藏
原文地址: http://www.cveoy.top/t/topic/h0Ti 著作权归作者所有。请勿转载和采集!