当前位置: 首页 > news >正文

Cookie和Session详解以及结合生成登录效果

目录

引言 

1.Cookie中的数据从哪来数据长啥样?

2.Cookie有什么作用?

3.cookie与session的工作关联?

4.Cookie到哪去? 

5.Cookie如何存? 

6.Session 

 7.Cookie与Session的关联与区别

8.通过代码理解 

8.1 相关代码

8.2 观察现象

8.3 总结 

9.Cookie结合Session 实现登录效果

1.前端代码(简易版界面)

2.后端 

3.现象

 4.小结

get和post的区别在这里有介绍: 


引言 

Cookie是浏览器提供的持久化存储数据的机制

1.Cookie中的数据从哪来数据长啥样?

cookie 是从服务器返回给浏览器的;是由程序员代码自定义的键值对结构数据。要在浏览器cookie中保存哪些数据,通过http响应的Set-Cookie字段把键值对写回去

2.Cookie有什么作用?

 Cookie在浏览器中存储临时数据

最典型的应用:存储“身份标识.

3.cookie与session的工作关联?

此处的身份标识(sessionId)就涉及到cookie和session的梦幻联动。

cookie是浏览器存储数据,session是服务器存储数据(存储用户的详细信息,同时给用户分配一个sessionId),此时服务器就把sessionId返回给浏览器,后续再访问浏览器中的页面时就会在请求上自动带上我们的sessionId,进一步服务器就知道哪个用户在操作了。

4.Cookie到哪去? 

Cookie中的内容会在下次访问该网站的时候自动带到http请求中。

5.Cookie如何存? 

cookie存储在浏览器所在的硬盘(往往会存在超时时间)中,浏览器按照不同的域名分别存储cookie,域名和域名之间的cookie不同相互干扰。

cookie在浏览器存储的目的是后续访问服务器的时候,通过请求的header将cookie发送给服务器

作用:因为服务器是同时服务多个客户端的,客户端需要借助cookie来告诉服务器当前提供的服务到哪个环节了,服务器也可以通过cookie识别该客户端

6.Session 

上述服务器生成了一些键值对结构数据,就是session(会话)

生成的唯一的身份序号叫做sessionid,也就是key,value就是记录的身份信息


具体流程:

用户登陆时,服务器在session中添加一个key-value记录,并且将key通过setCookie返回给客户端,客户端存储了cookie信息
客户端后续再发请求到服务器的时候,会通过http的header携带cookie信息
服务器收到请求之后,根据根据请求中的sessionid/token 在s ession 信息中获取到对应的用户信息 ,再决定后续的操作.
 

 7.Cookie与Session的关联与区别

Cookie和Session也是常用的跟踪用户身份和状态管理的机制。它们之间的关联与区别如下:

关联:

  • 在使用Session时,通常会在客户端保存一个名为JSESSIONID的Cookie,用于标识用户会话。
  • 服务器根据JSESSIONID从存储Session的位置(如内存或数据库)中获取对应的数据。

区别:

  • 存储位置:在Java中,HttpSession接口提供了对Session的访问和管理,Session对象默认存储在服务器端,而Cookie存储在客户端。
  • 数据容量:Cookie每个域名下的浏览器对数量和大小都有限制,而Session相对可以存储更多的数据。
  • 生命周期:Cookie可以设置过期时间,可以是临时的或长期有效的;而Session一般在会话结束后自动销毁,也可以手动设置过期时间。
  • 安全性:由于存储在客户端,Cookie存在被篡改和盗用的风险,可以通过设置属性增加安全性;而Session存储在服务器端,相对更安全。
  • 跨域支持:Cookie默认情况下只能在同一域内共享,可以通过设置domain属性实现跨域共享;而Session不受域的限制,可以在不同域之间共享。

在Java Web开发中,通常会使用Servlet API提供的HttpSession对象来管理Session。在登录认证成功后,服务器会创建一个唯一的JSESSIONID,并将相关的用户信息存储在HttpSession对象中,然后将JSESSIONID以Cookie的方式发送给客户端保存。客户端在后续的请求中会携带该Cookie,服务器通过解析Cookie中的JSESSIONID来获取对应的HttpSession对象,从而实现用户身份的认证和状态的保持。


8.通过代码理解 

8.1 相关代码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getcookie")
public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取到这次请求的cookieCookie[] cookies=req.getCookies();if(cookies!=null){for(Cookie cookie:cookies){System.out.println(cookie.getName()+" "+cookie.getValue());}}else{System.out.println( "请求中没有cookie");}//这里的if else 判断是在网页访问过程,500提示码提示的resp.getWriter().write("ok");}
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: 86180* Date: 2023-10-04* Time: 23:20*/
@WebServlet("/setcookie")
public class SetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//想通过这个方法把自定义的数据返回到浏览器Cookie cookie=new Cookie("data","2023-09-23");Cookie cookie1=new Cookie("time","09:48");resp.addCookie(cookie);resp.addCookie(cookie1);resp.getWriter().write("setCookie ok");}
}

 在pom.xml中从maven仓库https://mvnrepository.com/?__cf_chl_rt_tk=ptb7mN.OmXB2Pdf.tn5HNQSGzovAURAXJ95hEAo9vIA-1696475447-0-gaNycGzNDTs导入servlet和Jackson的对应依赖

8.2 观察现象

通过fiddler抓包就可以看出访问setcookie请求的时候,代码中就会构造cookie放在响应中,

进一步就返回到我们的浏览器中,后续再发请求的时候,我们的cookie就会在请求中

这时2,我们通过getcookie去获取,就可以再idea服务器中看到相应的cookie

8.3 总结 

cookie从服务器来,服务器调用相应的api,就可以给api添加setcookie字段,setcookie字段里面就是我们自定义的键值对,浏览器收到这些键值对,就会把这些键值对保存在浏览器本地,后续再给网站发送请求,就可以把cookie带到header里面 

9.Cookie结合Session 实现登录效果

 每个用户都应该有自己的session,session在服务器中存在很多份,每个服务器同时会有很多session,所以服务器会使用map来组织多个session,就像是一个Map<String,Object>

1.前端代码(简易版界面)

 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录</title></head><body><form action="login"method="post"><input type="text" name="username"><input type="password" name="password"><input type="submit" value="登录"></form></body></html>

 在idea重启服务器后

2.后端 

loginServlet(整体登录背后的逻辑成功登录后跳转)和IndexServlet(通过这个网页生成一个servlet)

/**getSession背后做的事情:*💡1.先读取请求中的cookie,看cookie中是否有JSESSIONID属性以及值是啥* 如果没有就认为需要创建新的会话;* 如果有,就拿着这个id去查询看看当前的session是否存在;*   要是session存在,就直接返回该session;*   要是session不存在就创建新的会话;*💡2.当前确实需要创建会话就会出安检处一个session对象,同时生成一个唯一的JSESSIONID.*  以JSESSIONID为key,Session对象为value,把这个键值对给插入到服务器的哈希表中。*💡3.刚才生成的JSESSIONID又会通过addCookie方法加入到 响应 中,* 此事响应就会带有Set-Cookie字段,这里的值就是JSESSIONID=****,* 通过响应,就把JsessionID返回到浏览器** **/import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/login")
public class loginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.先使用getParameter获取到username,password的值String username = req.getParameter("username");String password = req.getParameter("password");//验证信息是否正确//正常用数据库保存,这里写死//2.验证合法:zhangsan  123456if(!username.equals("zhangsan")){//失败//重定向=>登录页System.out.println("用户名错误");resp.sendRedirect("login.html");return;/**如果你想在登陆页面也显示出内容,就是如果错误就在页面显示用户名错误;* 就getWriter.write()* resp.setContentType("text/html;charset = utf8");* resp.getWriter().write("用户名错误");* 这边未注释的代码是显示到服务器端,在我们idea上就可以看见* */}if(!password.equals("123456")){//失败System.out.println("密码错误");resp.sendRedirect("login.html");return;}//成功//3.创建会话HttpSession session = req.getSession(true);//getSission(true);是拿着sessionId查一下哈希表,//如果sessionId不存在.或者没查到,就创建新会话插入到哈希表// 查到了就返回查到的结果//如何创建?//1.构造HttpSession对象//2.构造唯一的sessionId//3.把这个键值对插入哈希表//4.把sessionId设置到响应报文Set-Cookie字段//将用户信息保存到session对象中,保存一些自定义数据session.setAttribute("username",username);session.setAttribute("time",System.currentTimeMillis());//4.重定向到主页resp.sendRedirect("index");}
}写死//合法:zhangsan  12345if(!username.equals("zhangsan")){//失败//重定向=>登录页System.out.println("用户名错误");resp.sendRedirect("login.html");return;/**如果你想在登陆页面也显示出内容,就是如果错误就在页面显示用户名错误;* 就getWriter.write()* resp.setContentType("text/html;charset = utf8");* resp.getWriter().write("用户名错误");* 这边未注释的代码是显示到服务器端,在我们idea上就可以看见* */}if(!password.equals("123456")){//失败System.out.println("密码错误");resp.sendRedirect("login.html");return;}//成功//创建会话HttpSession session = req.getSession(true);//getSission(true);是拿着sessionId查一下哈希表,//如果sessionId不存在.或者没查到,就创建新会话插入到哈希表// 查到了就返回查到的结果//如何创建?//1.构造HttpSession对象//2.构造唯一的sessionId//3.把这个键值对插入哈希表//4.把sessionId设置到响应报文Set-Cookie字段//将用户信息保存到session对象中,保存一些自定义数据session.setAttribute("username",username);session.setAttribute("time",System.currentTimeMillis());//重定向到主页resp.sendRedirect("index");}
}
/*** Created with IntelliJ IDEA.* Description:* User: 86180* Date: 2023-10-05* Time: 18:05*/import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//通过这个网页生成一个servlet
@WebServlet("/index")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.先判定用户登陆状态//若没登陆.先登录//若登录,根据绘画用户名信息,显示到页面上HttpSession session = req.getSession(false);//不会触发会话创建if(session==null){System.out.println("用户未登录");resp.sendRedirect("login.html");return;}//2.登陆成功了取出之前的attributeString username = (String) session.getAttribute("username");Long time=(Long)session.getAttribute("time");System.out.println("username"+username+"time"+time);//执行到这里,session和post中的是一个对象//根据同一个sessionid对应到的对象//3.根据这样的内容构造出一个页面resp.setContentType("text/html;charset = utf8");resp.getWriter().write("欢迎您:" + username+"!上次登录时间"+time);}
}

3.现象

登陆成功后效果,登陆失败会在服务器端显示,如果想在页面也显示出来可以在loginServlet中对应位置代码中加上

resp.setContentType("text/html;charset = utf8");
resp.getWriter().write("*****");

通过 session.setAttribute("username",username);也将用户名保存了进去。

 4.小结

 当前这个程序,就涉及到三个部分进行联动~~

1.登陆页面(静态的 html ,使用 form 构造 http 请求)

2. LoginServlet ( doPost 处理登陆的逻辑流程1234)

3. IndexServlet ( doGet 处理主页的生成)

get和post的区别在这里有介绍: 

【http协议与tomcat - CSDN App】http://t.csdnimg.cn/s9K09

相关文章:

Cookie和Session详解以及结合生成登录效果

目录 引言 1.Cookie中的数据从哪来数据长啥样&#xff1f; 2.Cookie有什么作用&#xff1f; 3.cookie与session的工作关联&#xff1f; 4.Cookie到哪去&#xff1f; 5.Cookie如何存&#xff1f; 6.Session 7.Cookie与Session的关联与区别 8.通过代码理解 8.1 相关代码 8.2…...

Spring基础以及核心概念(IoC和DIQ)

1.Spring是什么 Spring是包含了众多工具方法的IoC容器 2.loC&#xff08;Inversion of Control &#xff09;是什么 IoC:控制反转,Spring是一个控制反转容器(控制反转对象的生命周期) Spring是一个loC容器&#xff0c;我们之前学过的List/Map就是数据存储的容器&#xff0c;to…...

《C和指针》笔记32:多维数组初始化

文章目录 使用括号进行初始化初始化省略维度 使用括号进行初始化 我们可以给数组赋值一个长长的列表&#xff1a; int matrix[2][3] { 100, 101, 102, 110, 111, 112 };它等价于 matrix[0][0]100; matrix[0][1]101; matrix[0][2]102; matrix[1][0]110; matrix[1][1]111; ma…...

零食食品经营小程序商城的作用是什么

零食几乎可以涵盖每个年龄阶段&#xff0c;同时又是市场中常见的零售批发商品&#xff0c;在多个场景中都有销售/购买属性&#xff0c;对消费者来说&#xff0c;购买零食的渠道多种多样&#xff0c;无论线下还是线上&#xff0c;都可随心而购。 庞大市场升级促进下&#xff0c…...

Java泛型--什么是泛型?

https://www.bilibili.com/video/BV1xJ411n77R?p5&vd_sourcebb1fced25254581cf052adea5e87a1ff 1.泛型类、接口 1.1.泛型类 泛型类的定义 class 类名称 <泛型标识, 泛型标识, ...> {private 泛型标识 变量名;...... }常用的泛型标识&#xff1a;T、E、K、V jav…...

LabVIEW工业虚拟仪器的标准化实施

LabVIEW工业虚拟仪器的标准化实施 创建计算机化的测试和测量系统&#xff0c;从计算机桌面控制外部测量硬件设备&#xff0c;以及在计算机屏幕上显示的类似仪器的面板上查看来自外部设备的测试或测量数据&#xff0c;所有这些都需要虚拟仪器系统软件。该软件允许用户执行所有这…...

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1&#xff1a;什么叫作用域 一&#xff1a;全局作用域 1&#xff1a;全局变量的声明 2&#xff1a;变量声明和使用的顺序 3&#xff1a;方法声明和使用的顺序 前言 1&#xff1a;什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…...

汇编指令集合

...

TinyWebServer整体流程

从main主函数开始&#xff1a; 一、定义MySQL数据库的账号、密码和用到的数据库名称。 二、调用Config获得服务器初始化属性 在这一步确定触发模式端口等信息。 三、创建服务器实例对象 设置根目录、开辟存放http连接对象的空间&#xff0c;开辟定时器空间。 四、利用Confi…...

【Java项目推荐之黑马头条】自媒体文章实现异步上下架(使用Kafka中间件实现)

自媒体文章上下架功能完成 需求分析 流程说明 接口定义 说明接口路径/api/v1/news/down_or_up请求方式POST参数DTO响应结果ResponseResult DTO Data public class WmNewsDto {private Integer id;/*** 是否上架 0 下架 1 上架*/private Short enable;}ResponseResult 自媒…...

自学(黑客)技术方法————网络安全

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…...

python+playwright 学习-84 Response 接口返回对象

Response 是获取接口响应对象,根据Response 对象可以获取响应的状态码,响应头部,响应正文等内容。 Response 相关操作方法 all_headers 所有响应HTTP标头, 返回Dict 类型 response.all_headers()body 获取 bytes 类型body内容 response.body()json 返回响应主体的 JS…...

GCN详解

a ⃗ \vec{a} a 向量 a ‾ \overline{a} a 平均值 a ‾ \underline{a} a​下横线 a ^ \widehat{a} a (线性回归&#xff0c;直线方程) y尖 a ~ \widetilde{a} a a ˙ \dot{a} a˙ 一阶导数 a \ddot{a} a 二阶导数 H(l)表示l层的节点的特征 W(l)表示l层的参数 D ~ \widet…...

总结二:linux面经

文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改&#xff1f;3、说说常用的Linux命令&#xff1f;4、说说如何以root权限运行某个程序&#xff1f;5、 说说软链接和硬链接的区别&#xff1f;6、说说静态库和动态…...

12、【Qlib】【主要组件】Qlib Recorder:实验管理

11、【Qlib】【主要组件】Qlib Recorder:实验管理 简介Qlib RecorderExperiment ManagerExperimentRecorderRecord Template简介 Qlib包含一个名为QlibRecorder的实验管理系统,旨在帮助用户以高效的方式处理实验并分析结果。 该系统有三个组件: 实验管理器(ExperimentMan…...

三一充填泵:煤矿矸石无害化充填,煤炭绿色高效开采的破局利器

富煤贫油少气是我国的能源禀赋特征&#xff0c;决定了我国以煤炭为主的能源结构&#xff0c;煤炭为国民经济发展提供了重要的基础。煤炭开采过程会对土地、地下水、空气等环境造成较大的污染&#xff0c;但大宗固废煤矸石无害化充填的技术手段可以有效改善这样的情况&#xff0…...

医疗器械标准目录汇编2022版共178页(文中附下载链接!)

为便于更好地应用医疗器械标准&#xff0c;国家药监局医疗器械标准管理中心组织对现行1851项医疗器械国家和行业标准按技术领域&#xff0c;编排形成《医疗器械标准目录汇编&#xff08;2022版&#xff09;》 该目录汇编分为通用技术领域和专业技术领域两大类&#xff0c;通用…...

C#和Excel文件的读写交互

C#和Excel文件的读写交互是一项重要的技术&#xff0c;在许多应用程序开发中起着关键作用。C#作为一种现代的面向编程语言&#xff0c;提供了丰富的库和功能&#xff0c;使开发人员能够轻松地处理Excel文件&#xff0c;并进行数据的读取和写入。 首先&#xff0c;让我们了解一下…...

Pytorch目标分类深度学习自定义数据集训练

目录 一&#xff0c;Pytorch简介&#xff1b; 二&#xff0c;环境配置&#xff1b; 三&#xff0c;自定义数据集&#xff1b; 四&#xff0c;模型训练&#xff1b; 五&#xff0c;模型验证&#xff1b; 一&#xff0c;Pytorch简介&#xff1b; PyTorch是一个开源的Python机…...

2023 年 Web 安全最详细学习路线指南,从入门到入职(含书籍、工具包)【建议收藏】

第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xff0c;每个行业都有自己的软件研发&#xff0c;网络安全作为一个行业也不例外&#xff0c;不同的是这个行业的研发就是开发与网络安全业务相关的软件。 既然如此&#xff0c;那其…...

qt常用控件1

QLabel QLabel用于显示文本或图像。不提供用户交互功能。标签的视觉外观可以通过多种方式进行配置&#xff0c;并且可用于为另一个小组件指定焦点助记键。 常用API介绍&#xff1a; 获取对应的文本信息&#xff1a; 设置对其方式&#xff1a; 设置能否进行换行 获取及设置标…...

想提高网站访问速度?CDN加速了解下

随着数字时代的到来&#xff0c;网站已成为企业展示自身实力和吸引目标受众的关键平台之一。然而&#xff0c;网站的成功与否往往取决于一个关键因素 - 速度。网站访问速度的快慢不仅影响用户体验&#xff0c;还对搜索引擎排名和转化率产生深远的影响。因此&#xff0c;网站加速…...

验证回文串[简单]

优质博文&#xff1a;IT-BLO-CN 一、题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个回文串。 字母和数字都属于字母数字字符。 给你一个字符串s&#xff0c;如果它是回文串&#xff0…...

Golang编译生成可执行程序的三种方法

目录 前言 正文 方法一、 方法二、 方法三、 结尾 前言 Golang是一种强类型、编译型、跨平台的编程语言&#xff0c;相同代码在不同平台上都可以编译出对应的可执行程序。今天就来简单介绍一下如何使用命令编译出可执行程序&#xff0c;本文以windows平台为例进行介绍。 …...

LabVIEW使用机器学习分类模型探索基于技能课程的学习

LabVIEW使用机器学习分类模型探索基于技能课程的学习 教育中的学习评估对教育工作者来说是一项繁琐的工作&#xff0c;但评估的好处是显着的。由于其开放性和复杂性&#xff0c;使用传统的评估方法为学生提供及时的支持一直具有挑战性。在Covid-19大流行期间突然转向在线学习&…...

凉鞋的 Godot 笔记 103. 检视器 :节点的微观编辑和查看

在上一篇&#xff0c;笔者简单介绍了场景与节点的增删改查&#xff0c;如下所示: 在这一篇&#xff0c;我们接着往下学习。 我们知道在场景窗口&#xff0c;可以对节点进行增删改查。 在 Godot 引擎使用过程中&#xff0c;场景窗口的使用频率是非常高的。 但是场景窗口只能编…...

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…...

找不到msvcp140.dll是什么意思?三个快速解决msvcp140.dll丢失问题的方法

msvcp140.dll 丢失意味着您的计算机上缺少Microsoft Visual C 2015 Redistributable中的一个动态链接库文件。msvcp140.dll是该软件包中的一个组件&#xff0c;许多应用程序和游戏都需要这个动态链接库文件才能正常运行。当您尝试运行需要 msvcp140.dll 的应用程序或游戏时&…...

[React源码解析] React的设计理念和源码架构 (一)

任务分割异步执行让出执法权 文章目录 1.React的设计理念1.1 Fiber1.2 Scheduler1.3 Lane1.4 代数效应 2.React的源码架构2.1 大概图示2.2 jsx2.3 Fiber双缓存2.4 scheduler2.5 Lane模型2.6 reconciler2.7 renderer2.8 concurrent 3.React源码调试 1.React的设计理念 Fiber: 即…...

[论文工具] LaTeX论文撰写常见用法及实战技巧归纳(持续更新)

祝大家中秋国庆双节快乐&#xff01; 回过头来&#xff0c;我们在编程过程中&#xff0c;经常会遇到各种各样的问题。然而&#xff0c;很多问题都无法解决&#xff0c;网上夹杂着各种冗余的回答&#xff0c;也缺乏系统的实战技巧归纳。为更好地从事科学研究和编程学习&#xff…...