SpringMVC内部提供了一个名为RequestContextListener
的监听器,该监听器继承自ServletRequestListener
,很明显,其就是监听Request对象的创建个销毁,很好的利用了这一点让我们能随时的获取到Request对象。
@Override
public void requestInitialized(ServletRequestEvent requestEvent) {
.......
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
// 放入了一个ThreadLocal中
RequestContextHolder.setRequestAttributes(attributes);
}
@Override
public void requestDestroyed(ServletRequestEvent requestEvent) {
.....
RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();
if (threadAttributes != null) {
// 避免线程泄露,手动从ThreadLocal中删除之前保存的Request对象
LocaleContextHolder.resetLocaleContext();
RequestContextHolder.resetRequestAttributes();
....
}
}
我们就可以利用如下代理随时获取Request了
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();