如何在Spring bean中获取客户端IP地址

4 java spring client-server

我已经定义了一个Spring bean.

<beans>
  <bean id="remoteService" class="edu.wustl.catissuecore.CaTissueApplictionServicImpl" />
</beans>
Run Code Online (Sandbox Code Playgroud)

有没有办法在这个类中获取客户端的IP地址?与servlet中可用的类似request.getRemoteAddr();

ska*_*man 16

最简单(也是最丑陋)的方法是使用RequestContextHolder:

  String remoteAddress = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes())
       .getRequest().getRemoteAddr();
Run Code Online (Sandbox Code Playgroud)

如果不了解更多关于你的bean以及它是如何接线的,那就是我能建议的最好的.如果您的bean是一个控制器(子类化AbstractController或带注释@Controller),那么它应该能够直接访问请求对象.

  • 我在本地主机上运行我的代码,然后在服务器端运行。服务器端它的工作完美。但是 localhost 返回 `0:0:0:0:0:0:0:1` 甚至使用 `getLocalAddr()` (2认同)

小智 8

获取客户端 IP 的最佳方法是循环遍历标头

   private static final String[] IP_HEADER_CANDIDATES = {
        "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" };

public static String getClientIpAddress(HttpServletRequest request) {
    for (String header : IP_HEADER_CANDIDATES) {
        String ip = request.getHeader(header);
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            return ip;
        }
    }
    return request.getRemoteAddr();
}
Run Code Online (Sandbox Code Playgroud)