如何在我的spring bean中获得HttpServletRequest?

Jas*_*ell 35 java apache-flex spring facebook

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

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

这将非常简单,但我无法弄清楚如何获得HttpServletRequest.我正在使用一个非常基本的Spring配置(这是我的第一个真正的Spring应用程序,现在我对它非常熟悉,但是我从来没有看过它.)

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

有帮助吗?

小智 110

如果FlexContext不可用:

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

HttpServletRequest request = 
        ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
                .getRequest();
Run Code Online (Sandbox Code Playgroud)

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

@Autowired
private HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 @Resource 批注代替 Autowired。您不需要明确地要求自动装配,并且您对 Spring 的绑定更少。 (5认同)
  • Autowired具有`boolean required()默认为true;` (2认同)
  • 获取错误:'未找到线程绑定请求:您指的是实际 Web 请求之外的请求属性,还是处理原始接收线程之外的请求在这种情况下,使用 RequestContextListener 或 RequestContextFilter 来公开当前请求 (2认同)

Jas*_*ell 11

这是一种特定的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()));
    }
Run Code Online (Sandbox Code Playgroud)

它有效,我得到了饼干.我的问题是寻找Spring - BlazeDS有它.春天可能也是这样,但我仍然不知道如何去做.


chr*_*acp 8

@eeezyy 的回答对我不起作用,尽管我使用的是 Spring Boot (2.0.4) 并且它可能有所不同,但 2018 年的一个变体因此有效:

@Autowired
private HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)

  • 它将抛出 fatal: `java.lang.IllegalStateException: No thread-bound request found: 您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在 Web 请求中进行操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。 (3认同)

小智 7

这应该可以做到

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getRequestURI();
Run Code Online (Sandbox Code Playgroud)


eee*_*zyy 6

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

我不得不使用

@Context
private HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)