org.apache.catalina包下request与session源码解析

场景:

在后台管理系统中,当用户登录了之后,会将用户信息放到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的时候

 

发布了442 篇原创文章 · 获赞 222 · 访问量 115万+

猜你喜欢

转载自blog.csdn.net/u013905744/article/details/100989516
今日推荐