java中的session

165 阅读2分钟

背景

session和cookie作为会话管理的实现方案,对此做较为深入的学习,本文是以java为例。

session会话

1. session的会话的过程

  • 客户端向服务端发起第一个请求(访问jsp或者sevlet)
  • 服务端获取客户端传递过来的cookie,找到一个key=JSESSIONID的cookie
  • 如果没有该cookie则服务端创建一个新的cookie返回给客户端
  • 客户端下次访问的时候自动携带该cookie给服务器

2. 会话创建过程的相关说明

  • 客户端发起第一个请求(访问jsp或者servlet)不一定会创建session

    1. 默认情况下访问jsp页面会创建一个session,因为session默认等于true

    2. 如果session=false,则希望通过request.getSession来创建session

      • request.getSession(false),则不会创建一个session,但是会获取之前已经传教的session,若之前也没有创建则,这返回null
      • request.getSession(true),会获取之前已经传教的session,若之前也没有创建则,这新建一个session返回。
  • JSESSIONID

    服务端创建的名为JSESSIONID的cookie和其他的cookie不太一样。服务端创建的名为JSESSIONID的cookie保存在浏览器的内存中,默认的过期时间是30分钟,关闭浏览器或者对应的标签页后,session就找不到了。可以通过在服务器端设置持久化到硬盘上(这其实是通过cookie的持久化技术,防止关闭浏览器后session失效的解法)。

    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(20);
    response.addCookie(cookie);
    
  • jsp的相关指令说明

    jsp中session=“false”之后不能使用jsp隐含的session对象。

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="ISO-8859-1" session="false" %>
    

    例如:

    image.png

    虽然不能使用隐含的session对象,但是可以通过request.getSession获得。

    <%
            HttpSession session = request.getSession(true);
            out.println(session);
    %>
    

    若session=true,则不同通过显示的方式生成session

    image.png

3. session相关API

getId
getCreationTime
getLastAccessedTime
setMaxInactiveInterval
getMaxInactiveInterval
isNew 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。
invalidate // 失效
getServletContext
setAttribute // 设置属性
getAttribute
removeAttribute
getAttributeNames

4. session的相关案例