天水企业网站建设/上海关键词优化推荐
💗wei_shuo的个人主页
💫wei_shuo的学习社区
🌐Hello World !
状态管理
问题引入
- HTTP协议是无转态的,不能保存提交的信息
- 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求联系
- 对于那些需要多次提交数据才能完成的web操作,比如登录,就难以完成
概念
将浏览器与web服务器之间多次交互当做一个整体来处理,并且多次交互所涉及的数据(状态)保存下来
状态管理分类
- 客户端状态管理技术:将转态保存在客户端,代表性的是Cooklie技术
- 服务器状态管理技术:将状态保存在服务器端,代表性的是session技术(服务器传递session时需要使用Cookie的方式)和application
Cookie
- Cookie是浏览器访问Web服务器某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的小段数据
- 一旦Web服务器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求中将这个Cookie回传给Web服务器
- 一个Cookie主要由标识该信息的名称
name
和值value
组成
Cookie的创建、获取、修改
- Cookie创建
@WebServlet(value = "/cs") public class CookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象Cookie cookie = new Cookie("username","weishuo");//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie的有效期 >0有效期,单位秒 =0浏览器关闭 <0内存存储 默认-1cookie.setMaxAge(60*60); //1小时//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie); //将Cookie添加到response对象中,响应给客户端} }
- Cookie获取
@WebServlet(value = "/get") public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过request对象获取所有的cookieCookie[] cookies = req.getCookies();if (cookies!=null){ //判断cookies数组是否为空,避免空指针异常//通过循环遍历Cookiefor (Cookie cookie : cookies) {System.out.println(cookie.getName() + ":" + cookie.getValue());}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }
- Cookie修改
如果修改Cookie的name和有效路径会新建cookie,而改变Cookie值,有效期会覆盖原有的Cookie
@WebServlet(value = "/cs2") public class CookieServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象Cookie cookie = new Cookie("username","given");//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie有效期cookie.setMaxAge(60*60*24*7); //7天//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie);} }
Cookie编码与解码
Cookie默认
不支持中文
,只能包含ASCII字符
,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
- 编码可以使用
java.net.URLEncoder类
的encode(String str,String encoding)
方法- 解码使用
java.net.URLDecoder类
的decode(String str,String encoding)
方法
//Cookie设置@WebServlet(value = "/cs3")
public class CookieServlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务端创建Cookie对象,使用Cookie编码Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));//设置Cookie的访问路径cookie.setPath("/Servlet_Projects_war/get");//设置Cookie有效期cookie.setMaxAge(600);//添加到response对象中,将Cookie响应给客户端resp.addCookie(cookie);}
}//Cookie读取@WebServlet(value = "/get")
public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过request对象获取所有的cookieCookie[] cookies = req.getCookies();if (cookies!=null){ //判断cookies数组是否为空,避免空指针异常//通过循环遍历Cookiefor (Cookie cookie : cookies) {//使用Cookie解码System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + ":" + URLDecoder.decode(cookie.getValue(),"UTF-8"));}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
总结
Cookie优点
- 可配置到期规则
- Cookie是一种基于文本的轻量级结构,包含简单的键值对
- Cookie默认在过期之前是可以一直存在在客户端浏览器上
Cookie的缺点
- 大小受到限制,浏览器对Cookie大小有4K,8K字节限制
- 用户配置为禁用,用户禁用了浏览器或客户端接受Cookie的能力
- Cookie可能被篡改,存在潜在风险
Session
概述
- Session用于记录用户的状态,Session指的是一段时间,单个客户端与web服务器的一连串交互过程
- 一个Session中,客户可能会多次请求访问同一个资源,也可能请求访问各种不同的服务器资源
原理
Tip:
Session和Cookie都是由服务器端创建
- 服务器为每一次会话分配一个Session对象
- 同一个浏览器发起的多次请求,同属于一次会话(Session)
- 首次使用Session,服务器自动创建Session,并且创建Cookie存储SessionID发送回客户端
session使用
Session作用域:拥有存储数据的空间,作用范围是一次会话有效
- 一次会话是使用同一浏览器发送到多次请求,浏览器关闭则会话结束
- 可以将数据存入Session中,一次会话的任意位置进行获取
- 可以传递任何数据(基本数据类型、对象、集合、数组)
获取session
//获取Session对象
HttpSession session = request.getSession();
System.out.println("id"+session.getId()); //唯一标识
package com.woniu.sessions;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet(name = "Servlet", value = "/ss")
public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();System.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
Session保存数据
- 保存数据到session中
setAttribute(属性名,Objects);
session.setAttribute("key",value); //以键值对形式存储在session作用域中
Session获取数据
- 获取session中数据
getAttribute(属性名);
session.getAttribute("key"); //通过String类型的key访问Object类型的value
Session移除数据
- 从Session中删除数据
removeAttribute(属性名);
session.removeAttribute("key"); //通过移除session作用域中的值
应用
- Servlet类
@WebServlet(name = "Servlet", value = "/ss") public class Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();//使用session保存数据session.setAttribute("username","given");//通过产生的session对象获取sessionIdSystem.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }
- GetValueServlet类
@WebServlet(name = "GetValueServlet", value = "/getValue") public class GetValueServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String username = (String) session.getAttribute("username");System.out.println("从session中获得了" + username); //从session中获得了given} }
- RemoveServlet类
@WebServlet(name = "RemoveServlet", value = "/remove") public class RemoveServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();session.removeAttribute("username");} }
- 结果
543D0EA33CB586691A02C00564E34CEA 从session中获得了given 从session中获得了null
Session & Request 区别
- request是一次请求有效,请求改变,则request改变
- session是一次会话有效,浏览器改变,则session改变
- SessionServlet类
@WebServlet(name = "Servlet", value = "/ss") public class SessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//通过request对象获取session对象HttpSession session = request.getSession();//使用session保存数据session.setAttribute("username","given");//使用request保存数据request.setAttribute("password",123456);//重定向跳转到/getValueresponse.sendRedirect("/Servlet_Projects_war/getValue");//通过产生的session对象获取sessionIdSystem.out.println(session.getId());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);} }
- GetValueServlet类
@WebServlet(name = "GetValueServlet", value = "/getValue") public class GetValueServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String password = (String) request.getAttribute("password");System.out.println("从request中获得了" + password);String username = (String) session.getAttribute("username");System.out.println("从session中获得了" + username); //从session中获得了given} }
- 结果
从request中获得了null 从session中获得了given
总结
sendRedirect跳转时,地址栏发生改变,代表客户端重新发送请求,属于两次请求;response没有作用域,两次request请求中的数据无法共享;而session只要浏览器不关闭属于一次会话,一次会话中浏览器数据可以共享
Session生命周期
- 开始:第一次使用到Session的请求产生,则创建Session
- 结束
- 浏览器关闭,则失效
- Session超时,则失效
- session.SetMaxInactivelnterval(seconds); 设置最大有效时间(单位/秒)
- 手工销毁,则失效
- session.invalidate(); 登录退出、注销
- LifeSessionServlet类
@WebServlet(name = "LifeSessionServlet", value = "/life") public class LifeSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取sessionHttpSession session = request.getSession();//设置session有效过期时间为10ssession.setMaxInactiveInterval(10);//通过产生的session对象获取sessionIdSystem.out.println(session.getId());} }
- GetSessionServlet类
@WebServlet(name = "GetSessionServlet", value = "/getSession") public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取sessionHttpSession session = request.getSession();System.out.println(session.getId());//手工销毁,立即失效//session.invalidate();} }
- 结果
浏览器输入/life,获取到的sessionId 71A9B2141F22840E0BE7EA67B49EC9B310秒内,浏览器输入/getSession,获取到的sessionId 71A9B2141F22840E0BE7EA67B49EC9B310秒后,浏览器输入/getSession,获取到的sessionId EDF2E31978DE8295486C2657016F5202
浏览器禁用Cookie解决方案
浏览器禁用Cookie后果
服务器在默认情况下,会使用Cookie的方式将sessionID发送给服务器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器使用如URL重写这样的方式来发送sessionID
URL重写
浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上sessionID)
实现URL重写
- response.encodeRedirectURL(String url); //生成重写的URL
//实现URL重写 String url = response.encodeRedirectURL("/Servlet_Projects_war/getSession");//输出URL重写地址 System.out.println(url);//重定向转发 response.sendRedirect(url);
- 结果
重写URL地址 /Servlet_Projects_war/getSession;jsessionid=A38B1C92B9CDE10F6ED5E7AA19E919F0浏览器输入/life,获取到的sessionId A38B1C92B9CDE10F6ED5E7AA19E919F0重定向转发地址:/Servlet_Projects_war/getSession,获取到的sessionId A38B1C92B9CDE10F6ED5E7AA19E919F0
🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——
点赞
👍收藏
⭐️评论
📝
相关文章:

Javaweb | 状态管理:Session、Cookie
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 状态管理 问题引入 HTTP协议是无转态的,不能保存提交的信息如果用户发来一个新的请求,服务器无法知道它是否与上次的请求联系对于那些需要多次…...

Redux
Redux 作用 集中式管理react、vue、angular等应用中多个组件的状态,是一个库,不单单可用于react,只是更多的用于react中 模型图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaFD3raR-1682994570670)(img/re…...

Nacos配置中心的详解与搭建
Namespace 简介 用于进行租户粒度的配置隔离,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置 配置Namespace 点击nacos的命名空间——点击新建命名空间 开发环境【dev】测试环境【test】正式环境【prod】 DataID 简介 Data ID 通常用于…...

Java入门教程||Java 封装||Java 接口
Java 封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码…...

微软开源AI修图工具让老照片重现生机
GitHub - microsoft/Bringing-Old-Photos-Back-to-Life: Bringing Old Photo Back to Life (CVPR 2020 oral) 支持划痕修复,以及模型训练。 Old Photo Restoration (Official PyTorch Implementation) Project Page | Paper (CVPR version) | Paper (Journal vers…...

什么是 Docker?它能用来做什么?
文章目录 什么是云计算?什么是 Docker?虚拟化技术演变特点架构镜像(Image)仓库(Registry )容器(Container) 应用场景 什么是云计算? 云计算是一种资源的服务模式&#x…...

生成器的创建方式(py编程)
1. 生成器的介绍 根据程序员制定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生成处理,而是使用一个,再生成一个,可以节约大量的内存。 2. 创建生成器的方式 生成器推导式yield 关键字 生成器推导式…...

百胜中国:未来将实现强劲增长
来源:猛兽财经 作者:猛兽财经 收入分析与未来展望 在过去的三年里,百胜中国(YUMC)的收入一直受到疫情导致的旅行限制和封锁的影响。为了应对疫情造成的业务中断,该公司开始专注于外卖业务,并将…...

【Celery】任务Failure或一直超时Pending
编写背景 task进入队列后,部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…...

【严重】VMware Aria Operations for Logs v8.10.2 存在反序列化漏洞(CVE-2023-20864)
漏洞描述 VMware Aria Operations for Logs前身是vRealize Log Insight,VMware用于处理和管理大规模的日志数据产品。 VMware Aria Operations for Logs 8.10.2版本中存在反序列化漏洞,具有 VMware Aria Operations for Logs 网络访问权限的未经身份验…...

java实现乘法的方法
我们都知道,乘法运算的核心思想就是两个数相乘,如果能将乘法运算转化成一个加数的运算,那么这个问题就很容易解决。比如我们要实现23的乘法,首先需要定义两个变量:2和3。我们将这两个变量定义为一个变量:2x…...

SSD目标检测
数据集以及锚框的处理 数据集: 图像:(batch_size , channel , height , width) bounding box: (batch_size , m , 5) m: 图像中可能出现的最多边界框的数目 5: 第一个数据为边界框对应的种…...

SpringBoot项目结构及依赖技术栈
目录 1、pom.xml文件配置说明 2、SpringBoot项目结构说明 3、入门案例关键配置说明 🌈 前面我们学习了SpringBoot快速入门案例,本节我们通过POM文件和项目结构分析两部分内容了解下关于SpringBoot的一些配置说明,以便全面了解SpringBoot项…...

crash怎么分析kdump core文件
kdump是Linux内核的一种机制,可以在出现系统崩溃时自动生成一个内存转储文件(core file),也称为crash dump。这个core文件包含了系统当时的内存状态和各个进程的调用栈信息,可以帮助分析和定位崩溃的原因。 要分析kdump core文件,…...

微内核与宏内核的区别和联系
微内核与宏内核的区别和联系 一、什么是内核?二、微内核和宏内核的区别 一、什么是内核? 内核是计算机操作系统的核心程序,它负责整个OS功能的调控。 二、微内核和宏内核的区别 微内核(Micro)宏内核(Monolithic/ Macro)地址空间内核服务和用…...

都什么年代了,还在用Excel和ACCESS做应用系统?快来学Eversheet
表格用的越久,就越头疼 稍微有规模的企业,各种表格都会多如牛毛,一堆堆的,有时候这里一张,那里一张,容易整乱,更容易丢失。不管你是用WPS还是用Excel,有些问题你还是依旧解决不了。…...

【JAVAEE】JAVA数据库连接(JDBC)
1.什么是JDBC? Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsyste…...

Nestjs全网最佳翻译-概况-守卫-Guards
守卫 带上装饰器 Injectable() 并实现了 CanActivate 接口的类,就是守卫。 守护只做一件事情。他们根据运行时的某些条件(如权限、角色、ACL等)来决定一个给定的请求是否会被路由处理程序处理。这通常被称为授权。在传统的Express应用程序中…...

【软考网络管理员】2023年软考网管初级常见知识考点(3)- 网络体系结构
【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家,希望看到我文章能给软考网络管理员备考的您带来一些帮助,5月27号也是全国计算机软件考试统一时间,也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…...

javascript正则表达式大括号、中括号、小括号的作用以及应用场景
在JavaScript正则表达式中,大括号 {}、中括号 [] 和小括号 () 都有不同的作用和应用场景。 大括号 {} 在正则表达式中,大括号 {} 表示重复次数。以下是一些常见的应用场景: {n}:精确匹配出现的次数,例如 \d{3} 匹配…...

5年测试老鸟总结,自动化测试的实施到落地,看这一篇足够...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…...

通达信顾比倒数线指标公式,信号不漂移
顾比倒数线是由技术派大师戴若顾比发明的,该指标利用三个重要的价格来判断入场或离场时机,可用于盘后制定下一个交易日的操作计划。此外,顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前,需要先了解顾比倒…...

网络安全: CIDR无类别路由
网络安全: CIDR无类别路由 CIDR是无类别路由,出现CIDR的原因是因为ipv4的地址被使用完客,CIDR的出现暂缓了ipv4用完的速度。 原本的ipv4很刻板,网络号分成8位,16位,24位作为掩码,也就是 xxx.0…...

NetMQ | 发布订阅时使用含通配符的Topic
NetMQ | 发布订阅时使用含通配符的Topic 文章目录 NetMQ | 发布订阅时使用含通配符的Topic前言通配符如何使用通配符通配符的作用结束语 前言 今天我来介绍一下NetMQ发布订阅时如何使用含通配符的Topic,让我们能够更加灵活地订阅消息。 什么是Topic? 在NetMQ中&am…...

行为型模式-模板方法模式
模板方法模式 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关…...

IPsec中IKE与ISAKMP过程分析(快速模式-消息1)
IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息3)_搞搞搞高傲的博客…...

PostgreSQL 数据类型转换
各种数据类型(日期/时间、integer、floating point和numeric)转换成格式化的字符串及反过来从格式化的字符串转换成指定的数据类型,在实际操作中经常遇到。下面总结了一些常用的函数。 日期操作函数 函数返回类型描述实例to_char(timestamp…...

【Java笔试强训 1】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🦾🦾🦾 目录 一、选择题 二、编程题 🔥组队竞…...

你买票了吗?五一火车票发售量创历史新高,车票总发售2209万张票
五一劳动节已经成为了除春节国庆节外最隆重的节日,是全国性的庆祝节日。在这个节日里,人们可以通过旅游、购物、娱乐等方式来放松身心,充满活力地迎接新的挑战。同时,五一假期也成为了国内外客流量最大的旅游黄金周之一࿰…...

DiffUtil的使用
RecyclerView的DiffUtil用于计算并更新RecyclerView中数据集的变化。通过使用DiffUtil,我们可以避免完全重新加载整个列表,并且只会更改必要的视图。 以下是DiffUtil的基本用法: 创建一个继承自DiffUtil.Callback的类来计算差异。在这个类中…...