场景:
在后台管理系统中,当用户登录了之后,会将用户信息放到session中,并将set-cookie=jsessionId的信息通过response header写回到浏览器中。
之后每次已登录用户发出请求的时候,浏览器会拿着cookie中的jsessionId,到一个Filter中做用户已登录校验。
那么有没有好奇,上面这个过程是如何发生的呢?
源码解析:
login流程
在login的时候,通过
session.setAttribute("user", user);
将其set到attributes中
StandardSession中有一个attributes字段,来存放session中的值
org.apache.catalina.session.StandardSession#attributes
/**
* The collection of user data attributes associated with this Session.
*/
protected ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<>();
一个Request会对应一个Session
org.apache.catalina.connector.Request#session
/**
* The currently active session for this request.
*/
protected Session session = null;
if (requestedSessionId != null) {
try {
session = manager.findSession(requestedSessionId);
通过下面这个方法,将session cookie放到response中
response.addSessionCookieInternal(cookie);
这个cookie对象
其会将cookie放到response中,当login完成后,会将cookie(jsessionId)更新到浏览器中。
当用户请求url的时候
springmvc会将浏览器的请求转换为Request对象,其中cookie中的jsessionId会转换为request中的字段
springmvc会将http请求 转换为HttpServletRequest对象,在这个过程中,会把http request headers中的cookie转换为HttpServletRequest对象中的requestedSessionId字段
用户点击退出
将服务器session设置为超时 浏览器cookie并没有做清除处理
三种情况下的流程图
其中的SessionFilter是我们自定义的做用户是否登录的过滤器
在spring security中的使用
也是访问AuthenticatorBase,之后生成session,并将cookie写到response中
同样也是在login的时候