前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年03月 Java教学课程 093-Servlet服务器的Session

【愚公系列】2023年03月 Java教学课程 093-Servlet服务器的Session

作者头像
愚公搬代码
发布2023-03-20 11:08:25
4060
发布2023-03-20 11:08:25
举报
文章被收录于专栏:历史专栏历史专栏

文章目录


一、会话技术

1.话管理概述

1.1 什么是会话

网页会话是指在用户与网站进行交互时,服务器会为每个用户创建一个会话,用于存储用户的信息和状态,以便在用户浏览网站的不同页面时能够保持用户的登录状态和其他相关信息。会话通常使用 cookie 或 URL 重写来实现。

1.2 会话管理作用

网页会话管理的作用是维护用户在网站上的登录状态和用户的个性化设置,以及在用户与网站之间的交互过程中保持数据的一致性。例如,当用户登录网站时,网站会创建一个会话并将会话 ID 存储在用户的浏览器 cookie 中,以便在用户浏览网站的不同页面时保持其登录状态。另外,网页会话管理还可以用于实现购物车、表单数据的保存等功能。

举例来说,当用户在购物网站上添加商品到购物车时,网站会将商品信息存储在用户的会话中,以便用户在结账时可以查看其购物车中的商品。如果用户在浏览网站的过程中关闭了浏览器或者会话过期,网站会自动清除用户的会话数据,以确保用户的数据安全性。

1.3 会话管理分类

网页的会话技术主要包括 Cookie 和 Session。Cookie 是一种在客户端保存数据的技术,可以在客户端保存一些用户信息,比如登录状态、购物车信息等。而 Session 则是一种在服务器端保存数据的技术,可以在服务器端保存用户的登录状态、权限等信息。两者的区别在于数据存储的位置不同,Cookie 存储在客户端,Session 存储在服务器端。

在JavaEE的项目中,会话管理分为两类。分别是:Cookie 和 Session

Cookie

​ 它是把要共享的数据保存到了客户端(也就是浏览器端)。每次请求时,把会话信息带到服务器,从而实现多次请求的数据共享。

Session

​ 它本质仍是采用客户端会话管理技术,只不过保存到客户端的是一个特殊的标识,并且把要共享的数据保存到了服务端的内存对象中。每次请求时,把这个标识带到服务器端,然后使用这个标识,找到对应的内存空间,从而实现数据共享。

本文主要是介绍Session。

2.服务端会话管理概述

2.1 HttpSession概述

1)HttpSession对象介绍

它是Servlet规范中提供的一个接口。该接口的实现由Servlet规范的实现提供商提供。我们使用的是Tomcat服务器,它对Servlet规范进行了实现,所以HttpSession接口的实现由Tomcat提供。该对象用于提供一种通过多个页面请求或访问网站来标识用户并存储有关该用户的信息的方法。简单说它就是一个服务端会话对象,用于存储用户的会话数据。

同时,它也是Servlet规范中四大域对象之一的会话域对象。并且它也是用于实现数据共享的。但它与我们之前讲解的应用域和请求域是有区别的。

域对象

作用范围

使用场景

ServletContext

整个应用范围

当前项目中需要数据共享时,可以使用此域对象。

ServletRequest

当前请求范围

在请求或者当前请求转发时需要数据共享可以使用此域对象。

HttpSession

会话返回

在当前会话范围中实现数据共享。它可以在多次请求中实现数据共享。

2)HttpSession的获取

获取HttpSession是通过HttpServletRequest接口中的两个方法获取的,如下图所示:

在这里插入图片描述
在这里插入图片描述

这两个方法的区别:

在这里插入图片描述
在这里插入图片描述
3)HttpSession的常用方法
在这里插入图片描述
在这里插入图片描述

2.2 HttpSession的入门案例

1)需求说明

在请求HttpSessionDemo1这个Servlet时,携带用户名信息,并且把信息保存到会话域中,然后从HttpSessionDemo2这个Servlet中获取登录信息。

2)案例目的

认识到会话域的作用,即多次请求间的数据共享。因为是两次请求,请求域肯定不一样了,所以不能用请求域实现。

最终掌握HttpSession对象的获取和使用。

3)使用
代码语言:javascript
复制
/*
    Session的基本使用
 */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求的用户名
        String username = req.getParameter("username");

        //2.获取HttpSession的对象
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());

        //3.将用户名信息添加到共享数据中
        session.setAttribute("username",username);

        //实现url重写  相当于在地址栏后面拼接了一个jsessionid
        resp.getWriter().write("<a href='"+resp.encodeURL("http://localhost:8080/session/servletDemo03")+"'>go servletDemo03</a>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/*
    Session的基本使用
 */
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取HttpSession对象
        HttpSession session = req.getSession();
        System.out.println(session);
        System.out.println(session.getId());

        //2.获取共享数据
        Object username = session.getAttribute("username");

        //3.将数据响应给浏览器
        resp.getWriter().write(username+"");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/*
    Cookie的禁用
 */
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取HttpSession对象
        HttpSession session = req.getSession(false);
        System.out.println(session);
        if(session == null) {
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("为了不影响正常的使用,请不要禁用浏览器的Cookie~");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
在这里插入图片描述
在这里插入图片描述
4)原理分析

HttpSession,它虽然是服务端会话管理技术的对象,但它本质仍是一个Cookie。是一个由服务器自动创建的特殊的Cookie,Cookie的名称就是JSESSIONID,Cookie的值是服务器分配的一个唯一的标识。

当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了。下图就是我们入门案例中,HttpSession分配的唯一标识,同学们可以看到两次请求的JSESSIONID的值是一样的:

在这里插入图片描述
在这里插入图片描述

2.3 HttpSession的钝化和活化

什么是持久态

​ 把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。

​ 我们把HttpSession持久态也叫做钝化。(与钝化相反的,我们叫活化。)

什么时候使用持久化

​ 第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。

​ 第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化

注意

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、会话技术
    • 1.话管理概述
      • 1.1 什么是会话
      • 1.2 会话管理作用
      • 1.3 会话管理分类
    • 2.服务端会话管理概述
      • 2.1 HttpSession概述
      • 2.2 HttpSession的入门案例
      • 2.3 HttpSession的钝化和活化
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档