会话管理

news2024/11/17 3:27:38

目录

一、为什么使用会话

二、cookie

1.概述

2.使用

(1) servletA向响应中增加Cookie

(2)浏览器访问ServletA响应回来的响应报文携带cookie 

(3)浏览器访问ServletB,将携带cookie的请求报文发送给ServletB接收 

3.设置cookie的时效 

(1)会话级和持久级cookie

(2)设置时效

4.设置cookie的提交路径

(1)为什么要设置?

(2)如何设置

三、Session 

1.HttpSession概述

2.HttpSession使用

 3.HttpSession时效性

 四、三大域对象

1.概述

 2.三大域对象的数据作用范围图解

请求域

会话域

应用域

所有域在一起  

3.域对象的使用

(1)域对象的API

(2)使用

4.应用场景


一、为什么使用会话

会话就是记录客户端的历史行为,浏览器发送请求,服务器接收并响应,但是服务器不记录请求是否来自哪个浏览器,服务器没记录浏览器的特征,就是客户端的状态

比如,多个用户点击超链接通过一个 servlet 各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点结帐 servlet 时,结帐 servlet 可以得到用户各自购买的商品为用户结帐。

  1. 用户体验:会话管理可以确保用户在访问应用时拥有连贯和无缝的体验。通过会话,可以跟踪用户的状态、偏好设置和历史记录,使得用户无需重复输入信息。

  2. 状态保持:在Web应用中,由于HTTP协议是无状态的,会话管理使得服务器能够维持用户的状态信息。例如,用户登录后,系统需要记住用户的身份,以便在后续请求中识别该用户。

  3. 安全性:会话管理能够帮助保护用户信息和防止未授权访问。通过管理会话ID和使用加密技术,可以降低会话劫持和其他安全风险。

  4. 数据一致性:在某些应用中,用户可能需要在多个步骤中输入数据。会话管理可以确保这些数据在多个请求之间保持一致,避免数据丢失。

  5. 个性化:通过会话管理,应用可以根据用户的历史行为和偏好提供定制化服务,提升用户满意度和忠诚度。

  6. 资源管理:会话管理可以帮助服务器有效管理资源,例如限制同时在线的用户数量或设置会话的过期时间,确保系统的性能和可用性。

保存会话数据的技术

1.cookie

cookie是在客户端保留少量数据的技术,主要通过响应头向客户端响应一些客户端要保留的信息

2.session 

session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息

3.cookie和session配合记录请求状态

二、cookie

1.概述

服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头,响应给客户端

客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie

cookie是一种键值对格式的数据,从tomcat8.5开始可以保存中文,但是不推荐

由于cookie是存储于客户端的数据,比较容易暴露,一般不存储一些敏感或者影响安全的数据

 

应用场景 

  1. 记录用户名

    当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.

  2. 保存电影播放进度

    在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到cookie中

2.使用

(1) servletA向响应中增加Cookie

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

(2)浏览器访问ServletA响应回来的响应报文携带cookie 

(3)浏览器访问ServletB,将携带cookie的请求报文发送给ServletB接收 

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求中的cookie
        Cookie[] cookies = req.getCookies();
        //迭代cookies数组
        if (null != cookies && cookies.length!= 0) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            }
        }
    }
}

3.设置cookie的时效 

(1)会话级和持久级cookie

会话级Cookie

  • 服务器端并没有明确指定Cookie的存在时间

  • 在浏览器端,Cookie数据存在于内存中

  • 只要浏览器还开着,Cookie数据就一直都在

  • 浏览器关闭,内存中的Cookie数据就会被释放

持久化Cookie

  • 服务器端明确设置了Cookie的存在时间

  • 在浏览器端,Cookie数据会被保存到硬盘上

  • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响

  • 持久化Cookie到达了预设的时间会被释放

(2)设置时效

使用cookie对象的API

cookie.setMaxAge(int expiry)参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        cookie1.setMaxAge(60);
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

4.设置cookie的提交路径

(1)为什么要设置?

通过cookie对象的API可以设置cookie的提交路径,如果没有设置,浏览器就把cookie放到请求报文直接发给下一个访问路径

访问互联网资源时不能每次都需要把所有Cookie带上。访问不同的资源时,可以携带不同的cookie,我们可以通过cookie的setPath(String path) 对cookie的路径进行设置

(2)如何设置

public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 创建Cookie
        Cookie cookie1 =new Cookie("c1","c1_message");
        // 设置cookie1的提交路径
        // 浏览器只有访问servletB,请求报文才有cookie1
        cookie1.setPath("/web03_war_exploded/servletB");
        Cookie cookie2 =new Cookie("c2","c2_message");
        // 将cookie放入响应对象
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }
}

 

三、Session 

1.HttpSession概述

HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的session. 这样服务端就可以通过session来记录某个客户端的状态了

原理

  • 服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONID以cookie的形式放入响应对象

  • 后端创建完session后,客户端会收到一个特殊的cookie,叫做JSESSIONID

  • 客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象

  • 通过该机制,服务端通过session就可以存储一些专门针对某个客户端的信息了

  • session也是域对象(后续详细讲解)

原理图 

应用场景 

  1. 记录用户的登录状态

    用户登录后,将用户的账号等敏感信息存入session

  2. 记录用户操作的历史

    例如记录用户的访问痕迹,用户的购物车信息等临时性的信息

2.HttpSession使用

定义ServletA,将用户名存入session  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求中的参数
        String username = req.getParameter("username");
        // 获取session对象
        HttpSession session = req.getSession();
         // 获取Session的ID
        String jSessionId = session.getId();
        System.out.println(jSessionId);
        // 判断session是不是新创建的session
        boolean isNew = session.isNew();
        System.out.println(isNew);
        // 向session对象中存入数据
        session.setAttribute("username",username);

    }
}

响应中收到了一个JSESSIONID的cookie  

定义其他Servlet,从session中读取用户名  

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取session对象
        HttpSession session = req.getSession();
         // 获取Session的ID
        String jSessionId = session.getId();
        System.out.println(jSessionId);
        // 判断session是不是新创建的session
        boolean isNew = session.isNew();
        System.out.println(isNew);
        // 从session中取出数据
        String username = (String)session.getAttribute("username");
        System.out.println(username);
    }
}

请求中携带了一个JSESSIONID的cookie  

 getSession方法的处理逻辑

当开启另外一个浏览器访问ServletA和ServletB, JSESSIONID和前面的浏览器的不一样,客户端不一样,线程不一样,会开启两个Session

 3.HttpSession时效性

为什么要设置session的时效?

  • 用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

  • 客户端关闭行为无法被服务端直接侦测,或者客户端较长时间不操作也经常出现,类似这些的情况,就需要对session的时限进行设置了

默认的session最大闲置时间(两次使用同一个session中的间隔时间) 在tomcat/conf/web.xml配置为30分钟

 

我们可以自己在当前项目的web.xml对最大闲置时间进行重新设定

 

也可以通过HttpSession的API 对最大闲置时间进行设定

// 设置最大闲置时间
session.setMaxInactiveInterval(60);

也可以直接让session失效

// 直接让session失效
session.invalidate();

 四、三大域对象

1.概述

域对象: 一些用于存储数据和传递数据的对象,传递数据不同的范围,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同

  • web项目中,我们一定要熟练使用的域对象分别是 请求域,会话域,应用域

  • 请求域对象是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发

  • 会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求

  • 应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话

 2.三大域对象的数据作用范围图解

请求域

会话域

应用域

所有域在一起  

3.域对象的使用

(1)域对象的API

API功能
void setAttribute(String name,String value)向域对象中添加/修改数据
Object getAttribute(String name);从域对象中获取数据
removeAttribute(String name);移除域对象中的数据

(2)使用

ServletA向三大域中放入数据  

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 向请求域中放入数据
        req.setAttribute("request","request-message");
        //req.getRequestDispatcher("servletB").forward(req,resp);
        // 向会话域中放入数据
        HttpSession session = req.getSession();
        session.setAttribute("session","session-message");
        // 向应用域中放入数据
        ServletContext application = getServletContext();
        application.setAttribute("application","application-message");

    }
}

ServletB从三大于中取出数据  

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从请求域中获取数据
        String reqMessage =(String)req.getAttribute("request");
        System.out.println(reqMessage);
        
        // 从会话域中获取数据
        HttpSession session = req.getSession();
        String sessionMessage =(String)session.getAttribute("session");
        System.out.println(sessionMessage);
        // 从应用域中获取数据
        ServletContext application = getServletContext();
        String applicationMessage =(String)application.getAttribute("application");
        System.out.println(applicationMessage);
    }
}

请求域<会话域<应用域

ServletA请求转发给ServletB,ServletB能从请求域获得数据,换成响应重定向就不行。

ServletA向会话域存数据,如果换一个浏览器访问同一个web项目,是获取不到会话域的数据的。

应用域不同就是web项目不同。

4.应用场景

  • 请求转发时,请求域可以传递数据请求域内一般放本次请求业务有关的数据,如:查询到的所有的部门信息

  • 同一个会话内,不用请求转发,会话域可以传递数据会话域内一般放本次会话的客户端状态有关的数据,如:当前客户端登录的用户

  • 同一个APP内,不同的客户端,应用域可以传递数据应用域内一般放本程序应用有关的数据 如:Spring框架的IOC容器

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索ORM宇宙:MyBatis-Plus的力量

**技术派项目源码地址 : ** **Gitee : 技术派 - https://gitee.com/itwanger/paicoding**Github : 技术派 - https://github.com/itwanger/paicoding **Mybatis-Plus 官网 : **MyBatis-Plus &#x1f680; 为简化开发而生 (baomidou.com) 整合Mybatis-Plus 引入依赖 <…

Flink之SQL client使用案例

Flink的执行模式有以下三种: 前提是我们已经开启了yarnsession的进程&#xff0c;在下图中可以看到启动的id也就是后续任务需要通过此id进行认证&#xff0c;以及任务分配的master主机。 这里启动时候会报错一个ERROR&#xff1a;org.apache.flink.shaded.curator.org.apache…

风电场风机安全监测系统解决方案

建设背景 随着风电产业的快速发展&#xff0c;风力发电已成为一种重要的清洁能源形式。风电场中的风塔是支撑风力发电机组的重要结构&#xff0c;其安全稳定运行对于风电场的正常运营和发电效率至关重要。然而&#xff0c;风塔常常面临风载、震动、腐蚀等多种外部因素的影响&a…

一键切换全球优质Linux 系统软件源及 Docker 源,轻松安装 Docker —— 适配广泛、零门槛、超强功能的开源脚本!

概述 linuxMirrors开源脚本为 GNU/Linux 系统用户提供了强大的工具,帮助用户轻松更换系统软件源并安装 Docker。脚本适配了多种国内外镜像站,经过测试具备良好的下载速度和 IPv6 兼容性,并且还包括了中国大陆教育网镜像站的选项。无需技术背景,文档提供了详尽的操作指引和常…

telegraf、influxdb、grafana安装配置及后端监听器操作

InfluxDB&#xff08;时序数据库&#xff09;&#xff0c;常用的一种使用场景&#xff1a;监控数据统计。 grafana&#xff0c;用作监控页面的前端展示。 telegraf&#xff0c;数据采集器。 ITG及快捷启动百度网盘&#xff1a;百度网盘 链接: 提取码: 0000 其他地址链接&am…

pycharm2023.1破解

下载解压文件&#xff0c;文件夹 /jetbra 复制电脑某个位置 注意&#xff1a; 补丁所属文件夹需单独存放&#xff0c;且放置的路径不要有中文与空格&#xff0c;以免 Pycharm 读取补丁错误。 点击进入 /jetbra 补丁目录&#xff0c;再点击进入 /scripts 文件夹&#xff0c;双…

JAVA中的网络编程巨详解(2w字)

在学习 Java 网络编程之前&#xff0c;我们先来了解什么是计算机网络。 计算机网络是指两台或更多的计算机组成的网络&#xff0c;在同一个网络中&#xff0c;任意两台计算机都可以直接通信&#xff0c;因为所有计算机都需要遵循同一种网络协议。 下面是一张简化的网络拓扑图…

【Unity开发】几种空值判断的性能测试

【Unity开发】几种空值判断的性能测试&#xff09; 项目优化过程中&#xff0c;一个非常细节的优化&#xff0c;就是在项目数据处理过程中&#xff0c;会用大量的null和“”空值的判断&#xff0c;参考了一些网友说的性能差别很大&#xff0c;是不是真的需要优化的问题&#xf…

Kafka【一】Windows下安装单节点Kafka

① 下载 下载软件安装包&#xff1a;kafka_2.12-3.6.1.tgz&#xff0c;下载地址&#xff1a;https://kafka.apache.org/downloads 这里的3.6.1&#xff0c;是Kafka软件的版本。截至到2023年12月24日&#xff0c;Kafka最新版本为3.6.1。2.12是对应的Scala开发语言版本。Scala2…

html+css+js实现盒子

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>禁止打开盖子</title><style>* {box-sizing: border-box;-webkit-font-smoothing: antialiased;t…

OAuth2-0协议安全学习

有一个问题困扰了很久很久&#xff0c;翻来覆去无法入眠&#xff0c;那就是OAuth2.0有什么安全问题啊 OAuth2.0是一种常用的授权框架&#xff0c;它使网站和 Web 应用程序能够请求对另一个应用程序上的用户帐户进行有限访问&#xff0c;在全世界都有广泛运用 OAuth2.0简介 O…

pygame开发课程系列(6): 游戏优化与发布

第六章 游戏优化与发布 在游戏开发过程中&#xff0c;优化性能和正确发布是至关重要的步骤。本章将探讨如何提升游戏性能&#xff0c;以及如何将游戏打包成独立的可执行文件&#xff0c;以便于分发和使用。 6.1 性能优化 优化游戏性能可以提升用户体验&#xff0c;确保游戏…

非标零部件加工:满足个性化需求的关键

在现代制造业中&#xff0c;非标零部件加工正逐渐成为满足个性化需求的关键环节。随着各行各业对产品独特性和定制化的要求不断提高&#xff0c;传统的标准零部件已经无法完全满足市场的多样化需求。时利和将分享关于非标零部件加工是如何满足个性化需求的。 非标零部件加工的核…

如何恢复火狐浏览器中丢失的书签记录?

如何恢复火狐浏览器中丢失的书签记录&#xff1f; 在数字时代&#xff0c;网络浏览器不仅是获取信息的窗口&#xff0c;更承载着个人习惯与数据&#xff0c;火狐浏览器&#xff08;Firefox&#xff09;以其强大的自定义功能和对用户隐私的重视而广受欢迎&#xff0c;书签的丢失…

资深研发的心愿:PostgreSQL未来若能加入这些功能,将更臻完善

我们已经与 PostgreSQL 和其他数据库一起工作了一段时间。在数据库管理领域&#xff0c;PostgreSQL 以其稳健性和灵活性脱颖而出。然而&#xff0c;随着开发人员在现代应用程序开发的复杂性中航行&#xff0c;还有一些额外功能可以简化他们的工作流。以下是我希望 PostgreSQL 具…

18Canvas 组件

18 Canvas 组件 Tkinter 的 Canvas 组件是一个灵活的绘图区域&#xff0c;允许我们在其中绘制图形、文本和图像。它支持各种绘图操作&#xff0c;如画线、画矩形、画圆形等。 Canvas 组件属性 width 和 height: Canvas的宽度和高度&#xff0c;可以是像素值或以字符为单位。…

【C++】unordered_set和unordered_map的封装(哈希)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 key和pair 仿函数hash 迭代器 operator HashTable.h my_unordered_map.h my_unordered_se…

【自动驾驶】控制算法(一)绪论与前期准备

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

白盒测试-发送请求

发送请求-怎么操作&#xff1f; 先创建发送请求对象mockmvc--用mockmvc对象发送请求&#xff08;包含请求url,请求头&#xff0c;请求参数等&#xff09; 用到的源码是mockmvc源码--其中perform方法&#xff0c;他的入参是接口类 用mockmvc对象发送请求&#xff0c;代码是mock…

【机器学习第11章——特征选择与稀疏学习】

机器学习第11章——特征选择与稀疏学习 11.特征选择与稀疏学习11.1子集搜索与评价子集搜索子集评价 11.2 过滤式选择11.3 包裹式选择11.4 嵌入式选择11.5 稀疏表示与字典学习稀疏表示字典学习 11.6 压缩感知 11.特征选择与稀疏学习 11.1子集搜索与评价 特征&#xff1a;描述物…