Tomcat session的实现:线程安全与管理

  本文所说的session是单机版本的session, 事实上在当前的互联网实践中已经不太存在这种定义了。我们主要讨论的是其安全共享的实现,只从理论上来讨论,不必太过在意实用性问题。

  

1. session 的意义简说

  大概就是一个会话的的定义,客户端有cookie记录,服务端session定义。用于确定你就是你的一个东西。

  每个用户在一定范围内共享某个session信息,以实现登录状态,操作的鉴权保持等。

  我们将会借助tomcat的实现,剖析session管理的一些实现原理。

 

2. tomcat 中 session 什么时候创建?

  session 信息会在两个地方调用,一是每次请求进来时,框架会尝试去加载原有对应的session信息(不会新建)。二是应用自己调用getSession()时,此时如果不存在session信息,则创建一个新的session对象,代表应用后续会使用此功能。即框架不会自动支持session相关功能,只是在你需要的时候进行辅助操作。

  

// case1. 框架自行调用session信息,不会主动创建session // org.springframework.web.servlet.support.SessionFlashMapManager#retrieveFlashMaps /** * Retrieves saved FlashMap instances from the HTTP session, if any. */ @Override @SuppressWarnings("unchecked") protected List<FlashMap> retrieveFlashMaps(HttpServletRequest request) { HttpSession session = request.getSession(false); return (session != null ? (List<FlashMap>) session.getAttribute(FLASH_MAPS_SESSION_ATTRIBUTE) : null); } // case2. 应用主动调用session信息,不存在时会创建新的session, 以满足业务连续性需要 @GetMapping("sessionTest") public Object sessionTest(HttpServletRequest request, HttpServletResponse response) { // 主动获取session信息 HttpSession session = request.getSession(); String sid = session.getId(); System.out.println("sessionId:" + sid); return ResponseInfoBuilderUtil.success(sid); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxzx.html