spring HttpServletRequest 简介

前提:工做遇到controller中经过注解的方式注入java

@Resource
private HttpServletRequest request;

咱们都知道spring 默认是单例,当遇到并发的时候线程不安全,可是通过测试它安全的。

综上,肯定spring确定对它作了处理,所以打开个人探索之路.....

上源码

public class RequestContextListener implements ServletRequestListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";

public RequestContextListener() {
}

public void requestInitialized(ServletRequestEvent requestEvent) {
if(!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException("Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
} else {
HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
        //放到这里了,RequestContextHolder下的requestAttributes让咱们跟进去瞅瞅
RequestContextHolder.setRequestAttributes(attributes);
}
}

----------------------------------------------------------------------------------------------------------------
public abstract class RequestContextHolder {    private static final boolean jsfPresent = ClassUtils.isPresent("javax.faces.context.FacesContext", RequestContextHolder.class.getClassLoader());  //原来如此啊,是经过threadLocal去保证的    private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");    private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Request context");    public RequestContextHolder() {    }
相关文章
相关标签/搜索