RequestContextListener监听器用于监听http请求,每当web应用接收到Http请求,该监听器就会调用初始化方法,将该请求保存在当前线程的ThreadLocalMap容器中。
public class RequestContextListener implements ServletRequestListener { //其他代码 @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(); ServletRequestAttributes attributes = new ServletRequestAttributes(request);//请求对象赋值给了attributes 对象的Request属性
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes);
}
//其他代码
当前线程的ThreadLocalMap容器存放的key,就是RequestContextHolder类中的静态ThreadLocal变量requestAttributesHolder:
public abstract class RequestContextHolder { //其他代码 private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal<RequestAttributes>("Request attributes"); //其他代码
当请求处理完毕,会调用RequestContextHolder.resetRequestAttributes()方法,清除容器中的请求。
1 public void requestDestroyed(ServletRequestEvent requestEvent) { 2 // 其他代码 3 4 RequestContextHolder.resetRequestAttributes(); 5 6 7 //其他代码 8 9 ++++++++++++++++ 10 RequestContextHolder.java{ 11 //其他代码 12 /** 13 * Reset the RequestAttributes for the current thread. 14 */ 15 public static void resetRequestAttributes() { 16 requestAttributesHolder.remove(); 17 inheritableRequestAttributesHolder.remove(); 18 } 19 //其他代码