在Java后台中,可以使用以下方法来识别客户端真实IP,即使经过代理伪装或Nginx转发等多重改写:

  1. 使用 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();
}
  1. 使用 X-Real-IP 头字段。该字段由Nginx服务器添加,也包含了客户端真实IP。同样需要进行验证。
String ipAddress = request.getHeader("X-Real-IP");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
    ipAddress = request.getRemoteAddr();
}
  1. 如果你在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可以被伪造或隐藏

java后台如何识别客户端真实ip可能经过代理伪装nginx转发等多重改写?具体代码实现

原文地址: http://www.cveoy.top/t/topic/h0Ti 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录