Servlet-会话管理

会话管理

HTTP是无状态协议

无状态即不保存状态,HTTP协议自身不对请求和响应之间的通信状态进行保存


会话管理的实现的手段

使用Cookie和Session配合解决

Cookie是在客户端保留少量数据的技术,主要是通过响应头向客户端响应一些客户端要保留的信息

Session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息

Cookie和Session配合记录请求状态


Cookie的创建

服务端创建Cookie,将Cookie放入响应对象中,Tomcat容器将Cookie转化为set-cookie响应头,响应给客户端

@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Cookie
        Cookie cookieA = new Cookie("keyA","valueA");
        Cookie cookieB = new Cookie("keyB","valueB");
        //将Cookie放入response对象
        resp.addCookie(cookieA);
        resp.addCookie(cookieB);
    }
}

Cookie的获取

在获取Cookie时,如果没有Cookie,Cookie数组为null 而不是 0

@WebServlet("/ServletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中携带的Cookie(以Cookie数组的形式储存)
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + " : " + cookie.getValue());
            }
        }
    }
}

Cookie的时效性

默认情况下Cookie的有效期是一次会话范围内,我们可以通过Cookie的setMaxAge()方法让Cookie持久化保存到浏览器上

  • 会话级cookie
    • 服务端没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据都一直在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie 在硬盘上的存在时间根据服务端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

setMaxAge方法的参数设置单位时间是秒,如果参数为0,则表示要将此cookie删除

cookieA.setMaxAge(60 * 60); //设置Cookie的时效时间为1小时

Cookie的提交路径

我们设置的Cookie在浏览器中保存,但无论是访问哪一个网页都会携带这个Cookie

为了解决这个问题,我们使用setPath()方法设置Cookie的携带路径

cookieB.setPath("/ServletB"); //只有访问ServletB页面才携带此Cookie

Session

Session是搭配Cookie使用的

Session用来在服务端记录客户端的某个状态,在用户访问服务端时被创建/找到

服务端在为客户端创建Session时,会同时将Session对象的id,即JSESSIONID以Cookie的形式放入响应对象

客户端在下次请求时携带JSESSIONID,服务端收到后,根据JSESSIONID找到相应的session对象

Session通常应用于记录用户的登录状态和用户的操作历史

Session也是域对象


Session的获取

在Servlet中获取Session的方法与Cookie不同,需要使用req调用getSession方法获取Session对象

HttpSession session = req.getSession(); //获取Session

这个方法的执行步骤:

  • 判断请求中有没有一个名为JSESSIONID的特殊Cookie
    • 如果有,则根据JSESSIONID找对应的Session对象
      • 找到对象后,将此对象返回
      • 如果没找到,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
    • 如果没有,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie

SessionAPI
方法名说明
getId()获取JSESSIONID
isNew()判断该Session是否为新建,而不是被找到
setAttribute()存放键值对在Session中
getAttribute(String key)根据键获取值的对象

注:Session中的值可以存放object类型,当我们知晓存入值类型可将他安全强转


Session的时效性

Session的时效性是30分钟,但有人访问后,会重新计时

我们可以在web.xml中设置Session的时效性

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

我们可以在Sevlet中单独设置Session的时效性(以秒为单位)

session.setMaxInactiveInterval(60 * 60); //设置Session的时效性为1小时