博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring session的生命周期
阅读量:5889 次
发布时间:2019-06-19

本文共 3885 字,大约阅读时间需要 12 分钟。

hot3.png

spring session的生命周期 博客分类: spring

spring session的生命周期

spring session生命周期

Session获取

spring-session实现了HttpServletRequest的子类–SessionRepositoryRequestWrapper,由它覆盖getSession方法,将由web容器处理的逻辑接管过来。

public HttpSession getSession(boolean create) {            HttpSessionWrapper currentSession = getCurrentSession();            if(currentSession != null) {                return currentSession;            }            String requestedSessionId = getRequestedSessionId();            if(requestedSessionId != null) {                S session = sessionRepository.getSession(requestedSessionId);                if(session != null) {                    this.requestedSessionIdValid = true;                    currentSession = new HttpSessionWrapper(session, getServletContext());                    //从数据仓库提取出来的session状态不为new                    currentSession.setNew(false);                    setCurrentSession(currentSession);                    return currentSession;                }            }            if(!create) {                return null;            }            S session = sessionRepository.createSession();            currentSession = new HttpSessionWrapper(session, getServletContext());            setCurrentSession(currentSession);            return currentSession;        }

session id存在的情况下,如果通过session id能找到持久化的session就直接返回,否则根据create是否为true决定是否新建一个Session。Session在后续的使用中会陆续更改,添加、删除或者修改属性值。从数据仓库中提取出来的session会默认修改lastAccessTime属性以避免session失效。

数据仓库中的持久化session也存在失效时间,消费端可以通过RedisHttpSessionConfiguration.setMaxInactiveIntervalInSeconds(long timemills)来设置,默认是1800秒。redis会定时清除过期数据。

spring-session的Session实现

Spring为了将Session与具体的协议分开,单独提炼出Session实体,再通过HttpSessionWrapper将session包装起来,从而扩展HttpSession.如果以后还需要支持另外一种应用协议,就只要增加一种应用类型的wrapper就行了。

private final class HttpSessionWrapper implements HttpSession {
public HttpSessionWrapper(S session, ServletContext servletContext) { this.session = session; this.servletContext = servletContext; } //省略了大部分方法,都是委托给被包装的Session处理的 //对session坐invalidate时去数据仓库删掉对应的数据 public void invalidate() { checkState(); this.invalidated = true; requestedSessionInvalidated = true; setCurrentSession(null); sessionRepository.delete(getId()); } public void setNew(boolean isNew) { this.old = !isNew; } public boolean isNew() { checkState(); return !old; } } }

Session实体主要定义通用的getAttribute和setAttribute等方法。此外扩展了一个ExpiringSession,这是spring的默认session,它主要用来判断session是否失效。

public interface ExpiringSession extends Session {
//session的创建时间 long getCreationTime(); //session的上次访问时间 long getLastAccessedTime(); //设置最大访问间隔,超过这个间隔session会被invalidate void setMaxInactiveIntervalInSeconds(int interval); int getMaxInactiveIntervalInSeconds(); //session是否失效 boolean isExpired();}

session提交

private void commitSession() {            HttpSessionWrapper wrappedSession = getCurrentSession();            if(wrappedSession == null) {                if(isInvalidateClientSession()) {                    httpSessionStrategy.onInvalidateSession(this, response);                }            } else {                S session = wrappedSession.session;                sessionRepository.save(session);                if(!isRequestedSessionIdValid() || !session.getId().equals(getRequestedSessionId())) {                    httpSessionStrategy.onNewSession(session, this, response);                }            }        }
  1. getSession时会通过setCurrentSession把新建或者提取出来的session放到request的HttpServletRequestWrapper.class.getName()属性上;相应的在session invalidate时也会将session从request里移除掉,此时通过getCurrentSession将取不到数据。
  2. 在做session持久化时,会首先判断session是否被invalidate,如果是则会删除

转载于:https://my.oschina.net/xiaominmin/blog/1598894

你可能感兴趣的文章
python类 del_全面了解Python类的内置方法
查看>>
前后端传图片用base64好吗_前后端分离 前台传base64的图片 tp5.1.1进行处理
查看>>
java对象的排序_Java对象排序两种方法
查看>>
java jni 原理_使用JNI技术实现Java和C++的交互
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
java 生成对称密钥_java中以DES的方式实现对称加密并提供密钥的实例
查看>>
java hostwrite_一个RUNNABLE状态的线程hang在了java.io.FileOutputStream.writeBytes方法上
查看>>
计算机java语言答案_【计算机考试】JAVA语言,求答案!!!
查看>>
java web session管理_Java Web之会话管理二:Session
查看>>
java 面向对象基本概念_Java面向对象-面向对象编程之基本概念
查看>>
java数值保留2位小数_java中如何使Double类型的数值保留两位小数问题
查看>>
java基础包括哪些内容_Java基础课程内容有哪些?
查看>>
java跨行_小白跨行学习Java的辛酸路程
查看>>
mysql5.7 外键错误_mysql5.7 创建表外键失败 求看下!!!! 折磨我一天了?
查看>>
python asyncio文件操作_Python中使用asyncio封装文件读写详解及实例
查看>>
java邮件数据库_java 发送数据库查询的数据作为excel表格邮件
查看>>
画图程序 java_一个JAVA画图程序
查看>>
java深度解析 pdf_这一份Spring源码解析PDF,阿里架构师直言:全网最深度解析!...
查看>>
为什么java类中可以创建实例_java – 为什么我出乎意料地能够创建我的单例类的多个实例?...
查看>>
将java与sql相连_JAVA与数据库MySQL相连接
查看>>