Cookie和session工作流程详解

目录

cookie机制

session会话

理解会话机制

Servlet中对Cookie和Session提供的

HttpServletrequest类中的方法:

模拟实现登录功能

首先实现功能分为两个界面:

 (1)登录页面代码(前端代码)

   (2) 编写LoginServlet处理上述登录请求

登录http请求格式如下:

   LoginServlet代码:

   验证用户登录要做的几个步骤:

编写主页的Servlet(登录成功之后跳转到的页面)

   index页面需要做的几个步骤:

   登录功能运行效果:

session会话是否会持久化保存?


前言

    虽然大部分客户端的数据都是从服务器中请求的,但是还有一小部分数据为了减轻服务器的负担,这一部分数据可以在浏览器本地中进行数据存储,如果此时的数据需要本地存储,是否可以直接写入硬盘呢,答案是否定的,如果允许网站直接把数据写入硬盘,此时有一些恶意网站就可能攻击客户端,把硬盘上的数据弄丢。

    所以引入了cookie机制,这种机制是可以把数据写入一些特定的文件的。

    此时身份标识如何分配,以及用户的身份信息如何具体存储(是需要服务器支持的),所以就有了Session(会话机制),通过Cookie和Session的配合,来完成本地数据的存储。

cookie机制

    首先类比到医院看病的例子,如果去医院看病,此时就需要以下的步骤:

1. 到医院后先挂号,此时就得到了一张就诊卡,这个就诊卡就是Cookie,里边有一个令牌,就是session。
2. cookie中存储了这个令牌(你的身份标识)
3. 后续去各个科室检查,开药,先刷就诊卡,就诊卡存储的是医生开的药,需要检查的项目。
4.  注:这个就诊卡中,只是存储了身份标识,此时你需要检查的项目,开的药方,都是根据就诊卡中的这个标识存储在医院的数据库中的,这个令牌(session)只是存储了你的身份标识。

    cookie是浏览器在本地存储数据的一种机制。cookie中存储了用户表示用户身份的一些信息。

cookie从哪里来?cookie是从服务器来,携带的数据就是用户需要在浏览器中保存的本地的数据,在响应中会带有Set-Cookie字段,通过这个字段就把本地数据返回给客户端。
cookie到哪去?cookie先是从服务器中把需要本地存储的数据传给客户端,之后客户端访问浏览器时就把本地的所有cookie通过http请求带给服务器。
cookie的作用最典型的应用就是用cookie保存当前用户的登录状态。

session会话

     如上图所示;这个令牌就是在cookie中保存的,Cookie用于保存用户身份标识,这样的场景中,身份标识如何分配,以及身份标识信息具体时如何进行存储的,都是需要服务器支持的。

    Session(会话)就是服务器用来实现用户身份区分的一种机制,通常是和Cookie搭配使用。

1. 首先给当前用户分配一个sessionId,同时记录下当前用户的一些身份信息(可以是自定义的)

2. sessionId就会被返回到浏览器的Cookie中,后续浏览器访问服务器时,就会带着sessionId。

3. 此时服务器就可以通过这个sessionId识别当前用户的身份了。

理解会话机制

    服务器同一时刻收到的请求是很多的,同一时刻服务器需要处理不同客户端发来的不同的请求,此时服务器就需要清楚的区分每个请求是属于哪一个用户的,就需要服务器记录每个用户令牌以及用户信息的对应关系。

    Session会话本质就是一个“哈希表”,存储了一些键值对结构,key就是令牌的id,value就是用户信息(用户信息是自定义的,灵活设计的)

   注:Session会话中的key必须是String类型,value是Object类(value可以是任意类型)。

Servlet中对Cookie和Session提供的支持

HttpServletrequest类中的方法:

 getSession方法的使用:

    getSession()中有一个参数,是boolean类型的,

    1. 如果参数为false,getSession的行为是:

(1)读取cookie中的sessionId
(2)在服务器中根据sessionId来查询对应的session对象
(3)如果查到了直接返回这个session对象,如果没有查到则返回null

    2. 如果参数为true,getSession的行为是:

(1)读取请求中cookie中的sessionId
(2)在服务器中根据sessionId来查询对应的session对象
(3)如果查到了,直接返回这个session对象
(4)如果没有查到,就会创建一个session对象,同时生成一个sessionId,以sessionId为key,session对象为value,把这个键值对鵆到服务器中的一个hash表中,同时把sessionId以 Set-Cookie的方式返回给浏览器

    注:如果参数为true,此时允许创建session对象,如果参数为false,此时不允许创建session对象。

模拟实现登录功能

     首先实现功能分为两个界面:

1. 登录页(包含两个输入框,输入用户名密码,以及一个登录按钮)点击登录按钮,就会发出一个http请求,服务器处理这个请求时会验证用户名和密码,如果用户名和密码都正确,就会跳转到主页。
2. 主页(只会显示当前登录的用户的用户名)(欢迎xxx)  其中,登录页就是一个html页面,还需要写一个Servlet,实现登陆时候用户名的密码校验,最后需要写一个Servlet 来生成主页(点击登录之后,跳转到主页中)。

(1)登录页面代码(前端代码)

/* form会组织用户输入的用户名和密码这部分数据以键值对的形式提交给服务器,其中 key 就是 input 的 name 属性其中 value 就是input 的 用户输入的内容最终会构造一个post请求,在body 中以键值对(类似query string)的格式进行数据的组织
*/
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><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" id=""><input type="password" name="password" id=""><input type="submit" value="登录" name="" id=""></form></body></html>

(2) 编写LoginServlet处理上述登录请求

    登录http请求格式如下:

POST /login(一般的登录请求都是post方法,就是向服务器提交一个什么样的数据)
Content-Type: application/x-www-form-unlencoded(请求的数据是以form表单的形式进行提交的)
username=zhangsan&passsword=123(这部分就是在url中携带的要交给服务器的数据)

LoginServlet代码:

package login;
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.先从请求中拿到用户名和密码//为了保证读出来的参数也能支持中文,要记得设置编码方式是 utf8req.setCharacterEncoding("utf8");String username = req.getParameter("username");String password = req.getParameter("password");//2.验证用户名和密码是否正确if (username == null || password == null || username.equals("") || password.equals("")) {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前输入的用户名和密码不能为空!");return;}//此处假设用户名只能是 zhangsan 或者是 lisi,密码都是123if (!username.equals("zhangsan") && !username.equals("lisi")) {//用户名有问题resp.setContentType("text/html;charset=utf8");resp.getWriter().write("用户名或者密码有误!");return;}if (!password.equals("123")) {//密码有问题resp.setContentType("text/html;charset=utf8");resp.getWriter().write("用户名或者密码有误");return;}//3. 用户名和密码都ok,此时就创建一个session会话,因为用户刚开始登录的时候是没有sessionId的//当前用户是未登录的状态,此时请求的cookie没有sessionId//此处的getSession是无法从服务器的 哈希表中查村到 该session对象的//此处的参数是设为true,是允许在getSession在查询不到的时候,创建新的session和sessionId的//并且会把这个session对象和sessionId 存储到哈希表中//同时返回这个session对象,并且在后续的响应中自动把这个sessionId返回给客户端浏览器HttpSession session = req.getSession(true);//然后让刚创建好的session对象存储自己写的自定义的数据,就可以在这个对象中存储用户的身份信息session.setAttribute("username",username);//session对象本身可以看成一个哈希表,可以存储键值对,key必须是String类型的,值是object类型的//4.登录成功之后,自动跳转到index主页resp.sendRedirect("index");}
}

验证用户登录要做的几个步骤:

1. 读取用户名和密码(先拿到用户名和密码才能验证数据是否是正确的)
2. 验证用户民密码是否正确(正常的登录程序药用数据库进行查询的,此处只是简单的约定用户名只能是zhangsan 或者 lisi,密码都是123)
3. 创建会话,保存必要的用户信息(因为此时是用户第一次进行登录,所以getSession中的参数药设置为true,允许创建一个会话,保存用户的登录信息)
4. 重定向(如果用户名和密码都是ok的,此时就跳转到另一个html界面,告知用户 “欢迎xxx”,此时用户就知道登录成功了),这个跳转页面就是用响应的重定向实现的。

编写主页的Servlet(登录成功之后跳转到的页面)

package login;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 {//此处禁止创建会话,如果没找到,用户就是未登录状态//如果找到了才认为是登录状态//这里和前边的创建session不一样,这里的目的只能是查询//要想创建,就必须是登录成功之后才能创建//此处浏览器跳转到这个界面,没有登录也不能创建session了HttpSession session = req.getSession(false);if (session == null) {//当前是未登录状态resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}//此时如果有session了并且登录成功了,就把这个username拿到//此时这个session和刚才未登录时创建的session时同一个对象,这因为sessionId是一样的//这里得到的username对应的value是object类型,需要强转成String类型String username = (String) session.getAttribute("username");if (username == null) {//虽然有session对象,但是里面没有必要的属性,我们也认为是登录状态异常resp.setContentType("text/html;charset=utf8");resp.getWriter().write("当前用户未登录!");return;}//如果上述的校验都是ok的,此时就生成一个动态的页面resp.setContentType("text/html;charset=utf8");resp.getWriter().write("欢迎你!" + username);}
}

 index页面需要做的几个步骤:

1. 跳转之后首先验证用户的身份(如果登录过,在登录时就会创建一个session),所以跳转页面不可以创建会话,只能是拿着这个session去服务器中查询,如果没有找到session则认为是未登录状态。

2. 如果找到了,就是登录状态,之后根据查到的session(此时这个session和刚才创建的session是一个session对象)拿到刚才登陆时存储的用户名。

3. 根据用户名在跳转之后的页面中返回一个响应。(欢迎xxx)

    注:刚才创建的session对象和登录之后查询的session对象是同一个对象,因为此时是同一个sessionId,刚才登录成功之后,sessionId会通过Set-Cookie返回给浏览器,浏览器下次访问IndexServlet的时候,就会带上这个同一个的sessiuonId,然后Indexservlet中拿着这个sessionId再查询,就查到了同一个session对象。

登录功能运行效果:

 

session会话是否会持久化保存?

    session会话不会一直存在,比如:服务器重启之后,原来hash表中的内容就没有了,此时再次访问,就会出现sessionId没有查询到,此时会被识别成“未登录状态”。

    服务器默认保存会话,是在内存中的,一旦重启服务器,此时会话的数据就没了。

    但是Smart Tomcat 例外,为了方便程序猿调试,它会在停止服务器时,把会话持久化保存,并且在下次启动的时候,自动把会话恢复到内存中。(此时会话是不会丢失的,但是这个流程是否生效和tomcat的版本是有关的)

    但是如果是手动部署程序到Tomcat,则默认会话还是在内存中进行保存的,重启会丢失会话。

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

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

相关文章

Mac - 鼠标拖尾特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效&#xff0c;如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外&#xff0c;能不能别的也…

MyBatis深入学习总结

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

window11中QQ登录“无法访问个人文件夹”解决方案

window11刚发行不久&#xff0c;安装各种软件或多或少会遇到各种bug&#xff0c;例如安装QQ后&#xff0c;打开时会提醒你“无法访问个人文件夹”而打开QQ失败。 可以通过改变你自己设置的个人文件夹的权限来解决这个问题。 找到文件夹所在位置&#xff0c;右击文件夹&#xf…

QQ登录显示无法访问个人文件夹解决办法

之前QQ登录出错&#xff0c;一直显示无法访问个人文件夹&#xff0c;是否自动修复个人文件权限 直接找到你安装qq的文件路径&#xff0c;右键--》授予访问权限--》删除访问&#xff0c;就可以正常登录了 &#xff01;

如何解决Windows10启动QQ时报错无法访问个人文件夹?

1、首先不要安装其他电脑管家&#xff0c;因为这会使Windows10自带的安全中心出现变化&#xff0c;第一步打开自带安全中心。 2、进入之后找到病毒和威胁防护&#xff0c;进入病毒和威胁防护设置。 3、进入病毒和威胁防护设置后&#xff0c;找到管理受控制文件夹访问权限。 4、…

启动QQ时无法访问个人文件夹XXX,是否自动修复个人文件夹权限

如图 点击确定显示修复权限失败 找到上图显示的文件路径 右键属性 -> 安全 -> 编辑 -> 选中Users -> 勾选完全控制

腾讯QQ登录“无法访问个人文件夹”解决方法

今天&#xff0c;登录QQ时出现“无法访问个人文件夹&#xff0c;个人文件将被保存到我的文档”的问题 上网搜索了一下&#xff0c;还是没有解决问题。然后自己思考了一下&#xff0c;可能与我修改了“我的文档”的路径有关&#xff0c;我刚刚安装的QQ个人文件夹也正好指定放在…

解决QQ显示“无法访问个人文件夹”方法

在qq登录的过程中&#xff0c;显示“无法访问个人文件夹”这样的提示&#xff0c;该怎解决&#xff1f; 尝试过把qq卸载之后重新装&#xff0c;改变一下qq的属性-兼容性&#xff0c;以及管理员的方式运行&#xff0c;查了不少的攻略&#xff0c;始终无法解决&#xff1b; 经过…

Win11 “qq无法访问个人文件夹”解决方法(原创)

今天登QQ&#xff0c;突然弹窗显示“qq无法访问个人文件夹”&#xff0c;网上搜了一堆方法都没用&#xff0c;也不想卸载重装qq&#xff0c;我就寻思是不是文件夹权限的问题。 右键显示的无法访问的个人文件夹&#xff0c;选择“安全”&#xff0c;我把Users的权限选中&#xf…

qq 微信 无法访问个人文件夹

昨天某个时刻开始&#xff0c;QQ会出现所有图片无法加载的状况&#xff0c;微信会出现截图发到聊天框是文件的问题。 一开始不以为然&#xff0c;直到第二天重启电脑发现两个软件都登陆不上去了。对应显示的是标题的关键字&#xff0c;因为问题已经解决就不截图了。 解决方案&…

android 新建桌面文件夹在哪里,添加并管理桌面文件夹

添加并管理桌面文件夹 我们在使用Android手机的时候&#xff0c;随着手机内安装的软件越来越多&#xff0c;比如说笔者的这个手机里&#xff0c;算了一下&#xff0c;一共装了110个应用程序&#xff0c;七个分页&#xff0c;每页显示16个图标。那么在这里我们设想一下&#xff…

Win11QQ无法访问个人文件夹

Win11QQ无法访问个人文件夹 #第一步 找到QQ文件存储的文件夹 #第二步 右键→属性→安全→User→编辑→User→完全控制→确定 #OK了 去试一试吧b(&#xffe3;▽&#xffe3;)d

C盘瘦身:QQ文件的清理及Group2文件夹

目录 问题解决方法 Windows 10 20H2 TIM 问题 最近C盘被撑爆了 使用SpaceSniffer一扫发现QQ的文件中有个Group2文件夹占了我17G 但使用QQ自带的个人文件夹清理却扫不到&#xff0c;据说直接删除会丢失近期所有群聊的聊天图片 解决方法 在这个地方找到了大神fsz1987给出的…

QQ个人文件夹保存位置无效

必须写文章谴责QQ这种垃圾软件 B 了 dog&#xff0c;腾讯家的QQ真没几个好用的。之前是PC版QQ群文件跳转回来显示错误bug&#xff0c;之后是手机QQ看点等各种消息bug&#xff0c;现在隔了几年了还有“个人文件夹保存位置无效”。根本没有改进&#xff01; QQ个人文件夹保存位…

Javamail使用IMAP同步QQ自定义文件夹问题

前言 最近使用Javamail同步QQ文件夹的时候发现,在QQ web端建立的文件夹,在手机端javamail却抛出FolderNotFoundExcetion的异常,这个困扰我几天了,我一度认为是javamail的bug.直到今天不经意间的一个发现,才解决了这个问题,以此来记录下! 不经意间的发现,验证截图:

QQ无法访问个人文件夹,修复失败问题

某一天QQ突然弹出一个【无法访问个人文件夹】点修复没用&#xff0c;卸载重下也没用&#xff0c;网上找了很多方法都没有用。 最后找到一个修改兼容性&#xff0c;成功启动。 右键→属性→兼容性→WindowsXP 虽然能启动&#xff0c;能用了&#xff0c;但是很不方便&#xff0…

foxmail本地文件夹同步服务器,foxmail同步QQ邮箱里的所有文件夹

随着微信消息的轰炸,我决定重拾邮箱。为了方便管理邮箱,我下载并试用了Foxmail和网易邮箱大师,Foxmail不确定用什么语言开发的,可能是C++或者Delphi(早期应该是Delphi,最新的版本不确定),而网易邮箱大师用的是基于duilib + directui进行开发的(微信PC客户端也是用这个进行…

android qq传文件夹,电脑传到手机QQ的资料在哪个文件夹里?

通常从电脑传到手机QQ的文件&#xff0c;在我的设备—我的电脑窗口中即可查看和使用&#xff0c;你也可以打开文件后点击保存到手机。即使不手动保存&#xff0c;在有网络的情况下&#xff0c;也会自动下载、保存到手机储存盘中的sd/tencent/QQfile_recv/路径的文件夹内。找到保…

Python高光谱遥感数据处理与机器学习实践技术丨Matlab高光谱遥感数据处理与混合像元分解

目录 Python高光谱遥感数据处理与机器学习实践技术 第一章 高光谱基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 Matlab 高光谱遥感数据处理与混合像元分解 第一章 理论…

Centos7 开启图形化界面 Linux安装VNC

环境: Centos7 windows连接&#xff1a;下载VNC Viewer 目录 VNC概述 VNC原理 一、检查是否安装过VNC 二、安装图形化界面 三、安装和配置VNC服务 四: 启动VNC及常用命令 五: VNC windos连接工具连接 VNC概述 VNC (Virtual Network Computing)是虚拟网络计算机的缩写…