文章目录
Seesion
1. 概念
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID。
2. 快速入门
-
获取HttpSession对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回。(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了。) -
使用HttpSession对象(session也是一个域对象)
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
Object getAttribute(String name) ;
void setAttribute(String name, Object value);
void removeAttribute(String name) ;
3. Session原理
基于响应头set-cookie和请求头cookie实现图解
4. Session细节
4.1 当客户端关闭后,服务器不关闭,两次获取Session是否为同一个?
默认情况下。不是。因为cookie默认是一次会话,JSESSIONID会被销毁掉。就没办法根据JSESSIONID去找session。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
代码演示
@WebServlet("/sessionServlet3")
public class SessionServlet3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建session对象
HttpSession session = request.getSession();
//设置参数
session.setAttribute("daye","heibangjiaofu");
//创建servletContext对象
ServletContext servletContext = this.getServletContext();
//将创建的session对象存储到servletContext域中。用于比对session的地址值
servletContext.setAttribute("session", session);
//创建Cookie对象存储sessionID
Cookie cookie = new Cookie("JSESSIONID",session.getId());
//设置cookie持久化时间
cookie.setMaxAge(60*10);//持久化10分钟
//写回cookie
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
访问/sessionServlet3将JSESSIONID存储到Cookie中
测试持久化JSESSIONID。
@WebServlet("/sessionServlet4")
public class SessionServlet4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//获取session中的值
String daye = (String) session.getAttribute("daye");
System.out.println(daye);
//获取servletContxt对象
ServletContext servletContext = this.getServletContext();
Object session2 = servletContext.getAttribute("session");
System.out.println(session==session2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
关闭浏览器后在访问/sessionServlet4会携带持久化cookie里面有JSESSIONID
访问结果:
heibangjiaofu session中的值。
true 证明获取的两个session对象是同一个对象。
4.2 客户端不关闭,服务器关闭后,两次获取的Session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作。(在tomcat/work目录下)
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上。
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
1.演示服务器钝化和活化,在IDEA中演示不了钝化和活化。所以把out目录下有关案例:验证码项目打成压缩包并改成war包。
IDEA为什么不能演示session钝化活化?
IDEA配置文件C:\Users\Administrator.IntelliJIdea2017.3\system\tomcat_basic-code下有一个work目录,每次在IDEA启动的时候,就会先删除work目录在创建一个新的work目录,新的work目录就找不到以前的SESSION.ser文件,就演示不了session钝化和活化,这个其实没什么关系,因为项目最终是要部署在服务器上面的,而不是在IDEA上。
2.将war包放入到tomcat7服务器下的webapps目录下,并启动服务器,服务器自动解压war包成day66。
3.访问登录页面服务器就会有客户端对应的session
4.然后正常关闭服务器,在tomcat7服务器的work\Catalina\localhost\day66下自动生成SESSION.ser,其实当服务器关闭后,这就是session的钝化。
5.在启动服务器SESSIONS.ser文件已经没有了,这就是session活化。