有没有一种静态方法可以在 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
注入HttpServletRequest
。 springboot
工作正常。
@Autowired
private HttpServletRequest httpServletRequest;
【讨论】:
以上是关于有没有一种静态方法可以在 Spring 中获取当前的 HttpServletRequest的主要内容,如果未能解决你的问题,请参考以下文章
自定义一个SpringUtil用于通过静态方法获取被spring管理的bean对象,用于在静态方法中使用IOC中的bean或者是没有被spring管理的类中使用IOC容器的bean
spring boot 打jar包,获取resource路径下的文件