//创建Cookie
Cookie cookie = new Cookie("mobile", mobile);
//设置Cookie的最大生命周期,否则浏览器关闭后Cookie即失效
cookie.setMaxAge(Integer.MAX_VALUE);
//将Cookie加到response中
response.addCookie(cookie);
public static HttpSession getSession(){
ServletRequestAttributes ra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ra.getRequest();
HttpSession session = request.getSession();
return session;
}
1. RequestContextHolder类
文档描述: Holder class to expose the web request in the form of a thread-bound RequestAttributes object.
,简单翻译下,这个类的作用是通过操作RequestAttributes
请求属性这个对象(绑定了线程)来间接处理请求相关的一些东西。
所以你可以看到代码中首先拿到了RequestAttributes
对象,当然这里要转成Servlet
类型。
2. ServletRequestAttributes类
如果不转型,那个attributes类是无法方便操作request
、session
这些原生servlet
相关的对象或者属性的,因为本身Java Web最原始的实现就是servlet
形式的,Spring框架当然会为其做特定的一些封装,也就是这个类的来源。
代码中首先通过属性拿到了HttpServletRequest
对象,然后通过请求对象拿到session
。
3. NamedThreadLocal
最后一个关键点就是,RequestContextHolder
如何绑定线程,说白了,它也是组合了ThreadLocal
,在setAttribute
中本质上也是把value放到ThreadLocalMap
中,相关源码如下:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder =
new NamedThreadLocal<RequestAttributes>("Request attributes");
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}