RequestContextListener實現了 ServletRequestListener ,在其覆蓋的requestInitialized(ServletRequestEvent requestEvent)方法中,將request最終設置到了RequestContextHolder中.
public class RequestContextListener implements ServletRequestListener { private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES"; @Override public void requestInitialized(ServletRequestEvent requestEvent) { if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) { throw new IllegalArgumentException( "Request is not an HttpServletRequest: " + requestEvent.getServletRequest()); } HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();//從事件對象中獲取request對象 ServletRequestAttributes attributes = new ServletRequestAttributes(request);//將request設置到servletRequestAttributes中 request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);//反過來將servletRequestAttributes設置到request中 LocaleContextHolder.setLocale(request.getLocale()); RequestContextHolder.setRequestAttributes(attributes);//再將servletRequestAttributes設置到requestContextHolder中 }
代碼中獲取該request的步驟:
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())) .getRequest();// 返回了RequestAttributes接口,將其強轉為ServletRequestAttributes實現類
使用上述方法前,需要先配置RequestContextListener監聽器:
<listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>