Cooike Session

1 会话技术

1.1 会话管理概述

1.1.1 什么是会话

这里的会话,指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。

举个例子:例如,你在给家人打电话,这时突然有送外卖的外卖小哥敲门,你放下电话去开门,收完外卖回来后,通话还在保持中,继续说话就行了。

1.1.2 会话管理作用

什么时候会用到会话管理呢?最常见的就是购物车,当我们登录成功后,把商品加入到购物车之中,此时我们无论再浏览什么商品,当点击购物车时,那些加入的商品都还在购物车中。

在我们的实际开发中,还有很多地方都离不开会话管理技术。比如,我们在论坛发帖,没有登录的游客身份是不允许发帖的。所以当我们登录成功后,无论我们进入哪个版块发帖,只要权限允许的情况下,服务器都会认识我们,从而让我们发帖,因为登录成功的信息一直保留在服务器端的会话中。

通过上面的两个例子,我们可以看出,它是为我们共享数据用的,并且是在不同请求间实现数据共享。也就是说,如果我们需要在多次请求间实现数据共享,就可以考虑使用会话管理技术了。

1.1.3 会话管理分类

在JavaEE的项目中,会话管理分为两类。分别是:客户端会话管理技术和服务端会话管理技术。

客户端会话管理技术

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

服务端会话管理技术

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

1.2 客户端会话管理技术

1.2.1 Cookie概述

1)什么是Cookie

它是客户端浏览器的缓存文件,里面记录了客户浏览器访问网站的一些内容。同时,也是HTTP协议请求和响应消息头的一部分(在HTTP协议课程中,我们备注了它很重要)。

2)Cookie的API详解

作用

它可以保存客户浏览器访问网站的相关内容(需要客户端不禁用Cookie)。从而在每次访问需要同一个内容时,先从本地缓存获取,使资源共享,提高效率。

Cookie的属性

属性名称属性作用是否重要
namecookie的名称必要属性
valuecookie的值(不能是中文)必要属性
pathcookie的路径重要
domaincookie的域名重要
maxAgecookie的生存时间。重要
versioncookie的版本号。不重要
commentcookie的说明。不重要

3)Cookie涉及的常用方法

创建Cookie

通过指定的名称和值构造一个Cookie

  • Cookie的名称必须遵循RFC 2109规范。这就意味着,它只能包含ASCII字母数字字符,

  • 不能包含逗号、分号或空格或以$字符开头。

  • 创建后无法更改cookie的名称。

  • 该值可以是服务器选择发送的任何内容。

  • 它的价值可能只有服务器才感兴趣。

  • 创建之后,可以使用 setValue 方法更改 cookie 的值 Cookie (String name, String value)

向浏览器添加Cookie

添加Cookie到响应中。此方法可以多次调用,用以添加多个Cookie。
        void addCookie(Cookie cookie);

从服务器端获取Cookie

        Cookie[] getCookies();

这是HttpServletRequest中的方法。

  • 它返回一个Cookie的数组,包含客户端随此请求发送的所有Cookie对象。

  • 如果没有符合规则的cookie,则此方法返回null。

1.2.2 Cookie快速入门

1)需求说明

通过cookie记录最后访问时间,并在浏览器上显示出来

2)案例目的

掌握cookie的基本使用,从创建到添加客户端,再从服务器获取

3)案例步骤

1、通过响应对象写出一个提示信息

2、创建cookie对象,指定name和value。

3、设置最大存活时间

4、通过响应对象,将cookie对象添加到客户端

5、通过请求对象获取cookie

6、写出cookie对象中的访问时间

4)代码示例

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.通过响应对象写出提示信息resp.setContentType("text/html;charset=UTF-8");PrintWriter pw = resp.getWriter();pw.write("欢迎访问本网站,您的最后访问时间为:<br>");//2.创建Cookie对象,用于记录最后访问时间Cookie cookie = new Cookie("time",System.currentTimeMillis()+"");//3.设置最大存活时间//cookie.setMaxAge(3600);cookie.setMaxAge(0);    // 立即清除//4.将cookie对象添加到客户端resp.addCookie(cookie);//5.获取cookieCookie[] arr = req.getCookies();for(Cookie c : arr) {if("time".equals(c.getName())) {//6.获取cookie对象中的value,进行写出String value = c.getValue();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");pw.write(sdf.format(new Date(Long.parseLong(value))));}}

细节

数量限制:

Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。同时,所有网站的cookie总数不超过300个。

存活时间限制setMaxAge()方法接收数字:

负整数:当前会话有效,浏览器关闭则清除

0:立即清除

正整数:以秒为单位设置存活时间

cookie路径限制:

第一个类

/*Cookie的路径限制取自第一次访问的资源路径前缀只要以这个前缀为开头(包括子级路径)。都能获取到反之获取不到*/
@WebServlet("/servlet/servletDemo02")
public class ServletDemo02 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建Cookie并添加Cookie cookie = new Cookie("username","zhangsan");cookie.setMaxAge(3600);resp.addCookie(cookie);}

第二个类

/*Cookie的路径限制*/
@WebServlet("/servlet/servletDemo03")
public class ServletDemo03 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取CookieCookie[] arr = req.getCookies();for(Cookie c : arr) {if("username".equals(c.getName())) {String value = c.getValue();resp.getWriter().write(value);}}}

第三个类:

/*Cookie的路径限制*/
@WebServlet("/servlet/aaa/servletDemo04")
public class ServletDemo04 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取CookieCookie[] arr = req.getCookies();for(Cookie c : arr) {if("username".equals(c.getName())) {String value = c.getValue();resp.getWriter().write(value);}}}

第四个类:

/*Cookie的路径限制*/
@WebServlet("/bbb/servletDemo05")
public class ServletDemo05 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取CookieCookie[] arr = req.getCookies();for(Cookie c : arr) {if("username".equals(c.getName())) {String value = c.getValue();resp.getWriter().write(value);}}}

1.3 服务端会话管理概述

1.3.1 HttpSession概述

1)HttpSession对象介绍

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

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

总结:

  • HttpSession:服务器端会话管理技术

  • 本质也是采用客户端会话管理技术,只不过客户端保存的是一个唯一标识符,而共享的数据保存到了服务端的内存对象中。

  • 每次请求时,会将特殊的标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享

作用:

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

2)HttpSession的获取

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

 

这两个方法的区别:

 

3)HttpSession获取方法

返回值方法名说明
HttpSessiongetSession()获取HttpSession
HttpSessiongetSession(boolean create)获取HttpSession 获取到就自动创建

4)HttpSession的常用方法

返回值方法名说明
voidsetAttribute(String var1, Object var2);设置共享数据
ObjectgetAttribute(String var1)获取共享数据
voidremoveAttribute(String var1)移除共享数据
Stringgetid()获取唯一标识
voidinvalidate();让session立即失效

1.3.2 HttpSession的入门案例

1)需求说明

通过第一个Servlet设置共享数据用户名,并在第二个Servlet获取到

2)案例目的

通过本案例的讲解,同学们可以清楚的认识到会话域的作用,即多次请求间的数据共享。因为是两次请求,请求域肯定不一样了,所以不能用请求域实现。

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

3)实现步骤

1.获取请求的用户名

2.获取HttpSession的对象

3.将用户名信息添加到共享数据中

4.在第二个Servlet中获取HttpSession对象

5.获取共享数据用户名

6.将获取的用户名响应给客户端浏览器

@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet{@Overrideprotected 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);
​
}
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet{@Overrideprotected 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+"");
}

4)原理分析

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

当我们使用HttpSession时,浏览器在没有禁用Cookie的情况下,都会把这个Cookie带到服务器端,然后根据唯一标识去查找对应的HttpSession对象,找到了,我们就可以直接使用了。

Cookie禁用演示:

/*Cookie的禁用*/
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet{@Overrideprotected 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~");}}

解决方案:

说明:

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

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

session01里面添加一段话

  @Overrideprotected 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);
//        3.将用户名信息添加到共享数据中session.setAttribute("username",username);resp.getWriter().write("<a href='"+resp.encodeURL("http://localhost:8080/lomodal/session03")+"'>go to session03<a/>");
​}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4088.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】行星碰撞机器人碰撞(栈的使用)

文章目录 行星碰撞机器人碰撞补充题目&#xff1a;2731. 移动机器人 参考资料 本文记录了两个使用栈来处理碰撞问题的算法题目。 行星碰撞 https://leetcode.cn/problems/asteroid-collision/ 对于这种题目&#xff0c;各个元素分别会向左或向右移动&#xff0c;可以使用栈…

无迹卡尔曼滤波在目标跟踪中的作用(二)

在上一节的内容中&#xff0c;我们介绍了UKF中最重要的内容—无迹变换UT&#xff0c;今天我们将具体介绍UKF是如何实现的。 好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; UKF算法的实现 我们知道&#xff0c;我们可以使用状态方程和观测方…

kotlin constructor init companion object 与初始化by lazy

kotlin constructor init companion object 与初始化by lazy class MyDemo(private var v: Int) {init {println("init $v")}constructor(m: Int, n: Int) : this(m) {println("constructor $m $n")}//只初始化一次companion object {private var TAG &qu…

死信是什么,如何运用RabbitMQ的死信机制?

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么&#xff0c;如何运用Rabbit…

Lesson1-1:OpenCV简介

图像处理 学习目标 了解图像的起源知道数字图像的表示 1 图像的起源 1.1 图像是什么 图像是人类视觉的基础&#xff0c;是自然景物的客观反映&#xff0c;是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布&#xff0c;“像“是人的视觉系统所接受的图在…

OpenStack(T版)——对象存储(Swift)服务介绍与安装

文章目录 OpenStack(T版)——对象存储(Swift)服务介绍与安装安装和配置(controller)准备安装和配置Swift对象存储服务组件创建账户 Ring创建容器 Ring创建对象 RingSwift 存储系统的主配置文件修改文件属主 安装和配置(compute)准备配置Swift对象存储服务组件 验证(1)加载环境变…

java压测工具 Jmeter初使用

一. 下载及安装教程 1. 有博主总结的很好&#xff0c;这里直接放传送门&#xff1a; 【Jmeter】win 10 / win 11&#xff1a;Jmeter 下载、安装、汉化、新机迁移、版本更新&#xff08;Jmeter 4 以上版本均适用&#xff09; 2. Jmeter 自定义创建桌面快捷方式 3. JMeter插件…

I/O复用的高级应用三——同时处理TCP和UDP服务

截至目前学习&#xff0c;我们讨论过的服务器程序都只监听一个端口。但在实际应用中&#xff0c;有不少服务器程序能同时监听多个端口&#xff0c;比如超级服务inetd和android的调试服务adbd。 从bind系统调用的参数看&#xff0c;一个socket只能与一个socket地址绑定&#xff…

Amdahl定律

Amdahl定律 例:设改进前系统执行时间为3s,改进后系统执行时间为2s 则:加速比3/2 即计算机改进后比改进前快了1.5倍 Amdahl定律影响因素 公式推导 可改进的系统比例为fe,则不可改进的部分比例为(1-fe) 不可改进的部分耗时为T0 * (1- fe) 设改进后部件耗时为T&#xff0c;则…

RISC-V处理器的设计与实现(三)—— 上板验证(基于野火征途Pro开发板)

文章目录 RISC-V处理器的设计与实现&#xff08;一&#xff09;—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;二&#xff09;—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;三&#xff09;—— 上板验…

考研算法35天:三元组的最小距离 【双指针,滑动窗口,多路归并】

算法详解 多路归并;多路归并算法从理论到应用&#xff08;易懂&#xff09;_留恋单行路的博客-CSDN博客 多路归并就是将多个已经归并排序排好序的数组再进行排序(不一定是通过归并排序)。 算法题目 这道题就是一般做法是先通过排序将三个数组排好然后再进行三指针求最小。但…

Tuxera NTFS2023Mac电脑免费U盘硬盘读写工具

Mac用户在使用NTFS格式移动硬盘时&#xff0c;会遇到无法写入硬盘的情况。要想解决无法写入的问题&#xff0c;很多人选择使用Mac读写软件。面对市面上“众多”的读写硬盘软件&#xff0c;用户应该怎么选择呢&#xff1f;初次接触移动硬盘的伙伴可能不知道移动硬盘怎么和电脑连…