ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

有什么帮助吗?


C
Chris Williams

如果 FlexContext 不可用:

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

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

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

@Autowired
private HttpServletRequest request;

您还可以使用 @Resource 注释而不是 Autowired。那时您不需要显式地要求自动装配,并且您对 Spring 的绑定更少。
自动连线有 boolean required() default true;
编辑建议删除信息,对于单例豆 Spring >= 3 是必需的。 Spring 2.5 中有一个错误/缺失的功能,将请求范围的 bean 注入到单例 bean 中无法正常工作
出现错误:'未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求在这种情况下,使用 RequestContextListener 或 RequestContextFilter 公开当前请求
J
Jason Maskell

这是一种特定于 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 有它。春天可能也有,但我仍然不知道如何去做。


c
chrismacp

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

@Autowired
private HttpServletRequest request;

它会抛出致命的:java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
L
Luiz Fernando França

这应该这样做

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

最后的 getRequestURI() 是不必要的。
C
Community

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

我不得不使用

@Context
private HttpServletRequest request;

M
Mateusz Niedbal

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

private final HttpServletRequest httpServletRequest;

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