是否有一种静态方法来获取当前请求的HttpServletRequest

Spr*_*key 23 spring servlets request

我正在使用Spring注释,我可以HttpRequestContext从Controller传递给服务.

我正在寻找一种静态的方式或任何更好的解决方案而不是RequestContext四处传播.

Abb*_*don 55

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 每隔几年我都会回到这个答案并重用这个片段。谢谢!!! (5认同)
  • 请记住在“web.xml”中将“org.springframework.web.context.request.RequestContextListener”声明为侦听器,这样才能正常工作。 (2认同)

Pan*_*hro 22

或者java8方式

public static Optional<HttpServletRequest> getCurrentHttpRequest() {
    return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
        .filter(ServletRequestAttributes.class::isInstance)
        .map(ServletRequestAttributes.class::cast)
        .map(ServletRequestAttributes::getRequest);
}
Run Code Online (Sandbox Code Playgroud)


Zaw*_* oo 13

我知道,这已经是答案了。我想标记为新更新。我们可以HttpServletRequest使用 来注入@Autowired。它运行良好springboot

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


IAR*_*ARI 7

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

    val currentRequest: HttpServletRequest?
        get() = (RequestContextHolder.getRequestAttributes() as? ServletRequestAttributes)?.request
Run Code Online (Sandbox Code Playgroud)