JavaEE9_Session

本文详细介绍了JavaEE9中的Session技术,包括其概念、快速入门、原理和细节。内容涉及Session如何依赖Cookie工作,Session何时销毁,以及在客户端关闭或服务器关闭后Session的变化。此外,还探讨了Session的特点,并通过案例展示了验证码的实现过程。
摘要由CSDN通过智能技术生成

Seesion

1. 概念

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID。

2. 快速入门

  1. 获取HttpSession对象
    HttpSession session = request.getSession();
    此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回。(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了。)

  2. 使用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活化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值