RequestContextListener


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 //其他代码

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM