【问题标题】:How to get Client IP address in Spring bean如何在 Spring bean 中获取客户端 IP 地址
【发布时间】:2009-12-30 10:16:31
【问题描述】:

我已经定义了一个 Spring bean。

<beans>
  <bean id="remoteService" class="edu.wustl.catissuecore.CaTissueApplictionServicImpl" />
</beans>

有什么方法可以获取这个类中客户端的IP地址吗?与 servlet request.getRemoteAddr() 中提供的类似;

【问题讨论】:

  • 1.) 这是一个 web 应用程序还是只是一些随机的 Spring 应用程序? 2.) edu.wustl.catissuecore.CaTissueApplictionServicImpl(或 gov.nih.nci.system.comm.server.ApplicationServiceServerImpl?)没有实现 AbstractController 真是太好了......但是 它实现了吗?如果它本身不是控制器,是否有一个“高于”这个控制器可以将它传递给这个类? 3.) 类的 Spring 配置已经发布在主要问题中 - 您需要发布代码,或者至少描述继承层次结构以及您的类与哪些其他 bean 交互。

标签: java spring client-server


【解决方案1】:

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

  String remoteAddress = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes())
       .getRequest().getRemoteAddr();

在不了解您的 bean 以及它是如何连接的情况下,这是我能建议的最好的方法。如果您的 bean 是控制器(子类化 AbstractController 或使用 @Controller 注释),那么它应该能够直接访问请求对象。

【讨论】:

  • 不,我的 bean 没有继承 AbstarctController。 bean 是: ttp://www.springframework.org" rel="nofollow" target="_blank">springframework.org /dtd/spring-beans. dtd"> 但是我的类路径中没有 RequestContextHolder。我正在使用弹簧 1.2.7
  • 我在本地主机上运行我的代码,然后在服务器端运行。服务器端它的工作完美。但是本地主机返回0:0:0:0:0:0:0:1,甚至使用getLocalAddr()
  • “它应该能够直接访问请求对象”——这是什么意思?
【解决方案2】:

获取客户端 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();
}

【讨论】:

    【解决方案3】:

    构造这个:

    @Autowired(required = true)
    private HttpServletRequest  request;
    

    并像这样使用:

    request.getRemoteAddr()
    

    【讨论】:

    • 这通常不适用于 bean:错误没有可用的“javax.servlet.http.HttpServletRequest”类型的合格 bean:预计至少有 1 个 bean 有资格作为自动装配候选者。
    猜你喜欢
    • 2015-10-18
    • 2012-03-14
    • 2012-02-16
    • 2019-01-14
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多