有没有一种静态方法可以在 Spring 中获取当前的 HttpServletRequest

Posted

技术标签:

【中文标题】有没有一种静态方法可以在 Spring 中获取当前的 HttpServletRequest【英文标题】:Is there a static way to get the current HttpServletRequest in Spring 【发布时间】:2010-10-10 04:17:15 【问题描述】:

我正在使用 Spring 注释,我可以将 HttpRequestContext 从 Controller 传递给 Service。

我正在寻找一种静态方式或任何比传递RequestContext 更好的解决方案。

【问题讨论】:

【参考方案1】:

如果您使用的是 spring,您可以执行以下操作:

public static HttpServletRequest getCurrentHttpRequest()
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes instanceof ServletRequestAttributes) 
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        return request;
    
    logger.debug("Not called in the context of an HTTP request");
    return null;

【讨论】:

把它当作豆子?在这里使用'autowired'而不是静态方法如何? 每隔几年我就会回到这个答案并重用这个 sn-p。谢谢!!! 记得在你的web.xml 中声明org.springframework.web.context.request.RequestContextListener 作为监听器,这样才能正常工作。【参考方案2】:

或者java8方式

public static Optional<HttpServletRequest> getCurrentHttpRequest() 
    return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
        .filter(ServletRequestAttributes.class::isInstance)
        .map(ServletRequestAttributes.class::cast)
        .map(ServletRequestAttributes::getRequest);

【讨论】:

您可以将过滤器替换为ServletRequestAttributes::isInstance 然后您可以在过滤器之后添加一个地图到ServletRequestAttributes::cast,以避免在后续地图上投射。 Java 中都不存在这些方法。【参考方案3】:

作为参考,这将是 Kotlin 的方式:

    val currentRequest: HttpServletRequest?
        get() = (RequestContextHolder.getRequestAttributes() as? ServletRequestAttributes)?.request

【讨论】:

【参考方案4】:

针对上面“或 Java 8 方式”的@andrebrait cmets,方法存在于ServletRequestAttributes.class

    public static Optional<HttpServletRequest> getCurrentHttpRequest() 
        return
            Optional.ofNullable(
                RequestContextHolder.getRequestAttributes()
            )
            .filter(ServletRequestAttributes.class::isInstance)
            .map(ServletRequestAttributes.class::cast)
            .map(ServletRequestAttributes::getRequest);
    

【讨论】:

isInstance 是否仍然适用于子类?【参考方案5】:

这对我有用:

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

【讨论】:

【参考方案6】:

我知道,这已经是答案了。我想标记为新更新。我们可以使用@Autowired 注入HttpServletRequestspringboot 工作正常。

@Autowired
private HttpServletRequest httpServletRequest;

【讨论】:

以上是关于有没有一种静态方法可以在 Spring 中获取当前的 HttpServletRequest的主要内容,如果未能解决你的问题,请参考以下文章

自定义一个SpringUtil用于通过静态方法获取被spring管理的bean对象,用于在静态方法中使用IOC中的bean或者是没有被spring管理的类中使用IOC容器的bean

spring boot 打jar包,获取resource路径下的文件

有没有一种快速的方法来获取当前页面 url 的结尾?姜戈

TStringGrid - 有没有一种简单的方法来获取“当前/选定”行?

在 Spring Boot 中获取对当前活动数据源的引用

是否有一种内置方法可以在没有任何查询参数的情况下获取当前 URL?