【问题标题】:How do I get a HttpServletRequest in my spring beans?如何在我的 spring bean 中获取 HttpServletRequest?
【发布时间】:2010-10-08 05:34:58
【问题描述】:

我正在开发一个带有基于 Flex 的前端和一个 Spring/Hibernate 后端的应用程序。

为了让 Facebook 集成以我目前的方式工作,我需要在后端读取在前端的 javascript 中设置的 cookie,并在登录期间进行一些验证,以查看用户是否正在尝试欺骗他的 Facebook 登录。

这很容易,但我不知道如何获取 HttpServletRequest。我正在使用一个非常基本的 Spring 配置(这是我的第一个真正的 Spring 应用程序,我现在对它非常熟悉,但是我从未看过很多内容。)

我没有使用 Spring MVC 或 Spring WebFlow 或类似的东西。我可以得到 ServletContext,但我还没有弄清楚如何获取请求。

有什么帮助吗?

【问题讨论】:

    标签: java apache-flex spring facebook


    【解决方案1】:

    这是特定于 Flex/BlazeDS 的,但这是我想出的解决方案。抱歉,如果回答我自己的问题是失礼。

        HttpServletRequest request = flex.messaging.FlexContext.getHttpRequest();
    
        Cookie[] cookies = request.getCookies();
    
        for (Cookie c:cookies)
        {
            log.debug(String.format("Cookie: %s, %s, domain: %s",c.getName(), c.getValue(),c.getDomain()));
        }
    

    它有效,我得到了饼干。我的问题是寻找 Spring - BlazeDS 有它。 Spring 可能也是如此,但我仍然不知道如何实现它。

    【讨论】:

      【解决方案2】:

      如果 FlexContext 不可用:

      解决方案 1:内部方法(>= 需要 Spring 2.0)

      HttpServletRequest request = 
              ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
                      .getRequest();
      

      解决方案 2:内部 bean(由 >= 2.5 支持,需要 Spring 3.0 的 singelton bean!)

      @Autowired
      private HttpServletRequest request;
      

      【讨论】:

      • 你也可以使用@Resource注解代替Autowired。那时您不需要明确要求自动装配,并且您对 Spring 的绑定更少。
      • Autowired 有boolean required() default true;
      • 编辑建议删除信息,对于单根豆 Spring >= 3 是必需的。 Spring 2.5 中有一个错误/缺失的功能,将请求范围的 bean 注入到单例 bean 中无法正常工作
      • Getting Error : 'No thread-bound request found: 你指的是实际 Web 请求之外的请求属性,还是处理原始接收线程之外的请求 在这种情况下,使用 RequestContextListener 或 RequestContextFilter公开当前请求
      【解决方案3】:

      @Context 注释(请参阅此问题的答案:What does context annotation do in Spring?)将导致它为您注入。

      我不得不使用

      @Context
      private HttpServletRequest request;
      

      【讨论】:

        【解决方案4】:

        @eeezyy 的回答对我不起作用,虽然我使用的是 Spring Boot (2.0.4),它可能会有所不同,但 2018 年的一个变化是这样工作的:

        @Autowired
        private HttpServletRequest request;
        

        【讨论】:

          【解决方案5】:

          应该这样做

          ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getRequestURI();
          

          【讨论】:

            【解决方案6】:

            更好的方法是使用构造函数自动装配:

            private final HttpServletRequest httpServletRequest;
            
            public ClassConstructor(HttpServletRequest httpServletRequest){
                  this.httpServletRequest = httpServletRequest;
            }
            

            【讨论】:

              猜你喜欢
              • 2021-08-17
              • 1970-01-01
              • 2015-07-13
              • 2018-10-19
              • 1970-01-01
              • 2010-10-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多