JavaWeb12-Session

Session介绍

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

关于HttpSession对象

  • Session的作用 Session的作用就是为了标识一次会话,或者说确认一个用户。并且在一次会话(一个用户的多次请求)期间共享数据,可以通过req.geySession()方法,来获取当前会话的session对象。

  • JSESSIONID SessionId是为了标识一次会话的唯一标志。每当一次请求到达服务器,如果开启了会话(访问了session),服务器第一步会查看是否从客户端回传一个名为JSESSONID的cookie: 1)、如果JSESSIONID不存在,则服务器会新建session对象,并重新标识; 2)、如果JSESSIONID存在,服务器会将客户端回传过来的ID去服务器中查找与之对应的session对象。 3)、如果没找到,则服务器会新建session对象,并重新标识; 4)、如果找到,则获取session对象,响应给客户端

  • Session域对象 通过setAttribute(name,value); 方法向域对象中添加数据。 通过getAttribute(name); 从域对象中获取数据。 通过removeAttribute(name);从域对象中移除数据。

  • Session的失效 1)、达到最大不活动时间 Tomcat中默认最大不活动事件为30min。 可以自行修改默认不活动时间,但不建议。 2)自己设定过期时间 通过session.setMaxInactiveInterval(int);来设定session的最大不活动时间,单位为秒。 通过getMaxInactiveInterval()方法来查看当前session对象的最大不活动时间。 3)、立即失效 手动销毁session对象 session.invalidate(); 4)、关闭浏览器 session的底层依赖于cookie,默认关闭浏览器失效。 5)、关闭服务器 非正常关闭服务器才会失效。 如果是正常关闭服务器,session会被钝化到本地磁盘,下次访问时会从本地磁盘中活化出来。

public class Servlet01 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=utf-8");
       resp.setCharacterEncoding("utf-8");
       req.setCharacterEncoding("utf-8");
       HttpSession session = req.getSession(); // 获取Session
       session.setAttribute("name", "张三"); // 添加属性
       String id = session.getId(); // 获取Session的id
       System.out.println(id); // 观察是否为新的id, 如果和上面的id不一样,说明为新创建的
       resp.getWriter().write("是否为新" + String.valueOf(session.isNew())); // 判断Session是否为新创建的
  }
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
  }
}

设置session的失效时间

session.setMaxInactiveInterval(); // 单位:秒

设置session的失效时间也可以通过以下方式, 在web.xml中进行统一设置

<!-- 可以设置session 的有效时间 -->
 <session-config>
   <!-- 以分钟为单位 -->
   <session-timeout>1</session-timeout>
 </session-config>

setMaxInactiveInterval和session-config的比较:

1、setMaxInactiveInterval的优先级高,如果setMaxInactiveInterval没有设置,则默认是session-config中设置的时间。

2、setMaxInactiveInterval设置的是当前会话的失效时间,不是整个web服务的。

3、setMaxInactiveInterval的参数是秒,session-config当中配置的session-timeout是分钟。

4、设置setMaxInactiveInterval(-1)是永久有效。(负数或0)

public class Servlet02 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html;charset=utf-8");
       resp.setCharacterEncoding("utf-8");
       req.setCharacterEncoding("utf-8");
       HttpSession session = req.getSession();
       session.setAttribute("name", "张三"); // 添加属性
       Object name = session.getAttribute("name"); // 也可以获取对象
       System.out.println(name);
       // 删除session中的属性
       session.removeAttribute("name");
       // 注销session, 一旦注销, 会产生一个新的sessionid
       session.invalidate();
       System.out.println(session.getId());
  }
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
  }
}

输出如下,一旦注销,会产生一个新的sessionID

原文地址:https://www.cnblogs.com/Patrick20726/p/13586394.html