1、Session概述

服务端会话技术

这里说的Session指的是HttpSession,该对象用于提供一种通过多个页面请求或访问网站来标识用户并存储有关该用户的信息的方法。

标识储存在客户端,数据保存到服务端的内存对象中

是Servlet规范中四大域对象之一的会话对象

域对象作用范围使用场景
ServletContext整个应用范围当前项目中需要数据共享时,可以使用此域对象。 应用域
ServletRequest当前请求范围在请求或者当前请求转发时需要数据共享可以使用此域对象。请求域
HttpSession会话返回在当前会话范围中实现数据共享。它可以在多次请求中实现数据共享。会话域

2、常用方法

22090302

3、获取

22090303

4、使用

场景 不同Servlet之间的数据共享

@WebServlet("/sessionDemo01")
public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求用户名
        String name = req.getParameter("name");
        //获取session对象 查看是否同一id
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());
        //存入session
        session.setAttribute("name",name);
        //访问提示
        System.out.println("demo01");
    }
}
@WebServlet("/sessionDemo02")
public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session对象 查看是否同一id
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());
        //获取共享数据
        String name = (String) session.getAttribute("name");
        //控制台打印
        System.out.println("02 "+name);
    }
}

5、细节

  • 浏览器禁用Cookie session无法获取

    • 解决

      • 提示用户打开Cookie
      • 访问时拼接Jsessionid,通过encodeURL()重写地址
       resp.getWriter().write("<a href='"+resp.encodeURL("http://localhost:8080/web/sessionDemo02")+"'>go demo02</a>");
      
  • 活化和钝化

    • 钝化:把长时间不用,但还不到过期时间的HttpSession序列化,写道磁盘上。与之相反称为活化
    • 何时钝化
      • 当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。
      • 当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化

    tips:

    ​ HttpSession的持久化由服务器来负责管理,我们不用关心。

    ​ 只有实现了序列化接口的类才能被序列化,否则不行。