Cookie和Session的工作流程以及Servlet中与之相关的API

news2024/9/27 5:54:23

目录

一、认识Cookie和Session

1、Cookie

2、Session

二、Cookie和Session的工作流程

三、Servlet中与Cookie和Session相关的API 

1、HttpServletRequest类中的相关方法

2、HttpServletResponse类中的相关方法

3、HttpSession类中的相关方法

4、Cookie类中的相关方法

四、代码示例:实现用户登录

1、登录页面

2、处理登录请求

3、生成主页内容

4、查看抓包结果

POST请求

GET请求


一、认识Cookie和Session

1、Cookie

Cookie是浏览器在本地持久化保存数据的一种方案,最典型的使用方式就是存储登录信息。

由于HTTP协议自身是属于“无状态协议”,即默认情况下,HTTP协议的客户端和服务器之前的本次通信和下次通信之间没有直接的联系。

例如,我们登录到一个网站之后,访问该网站中的其他页面时,服务器不知道用户是否已经登录过了。

因此就需要通过Cookie和Session来存储用户的登录信息。

2、Session

Session是一种会话机制,服务器同一时刻收到的请求是很多的,为了清楚地区分每个请求来自于哪个用户,就需要在服务器这边记录用户令牌以及用户相关信息的对应关系。

每个用户令牌(sessionId)都是由服务器生成的一个“唯一性字符串”,而每个用户的相关信息都是由一个Session对象来存储,Session对象本身也是一个键值对结构(具体信息由程序猿设定)。

二、Cookie和Session的工作流程

三、Servlet中与Cookie和Session相关的API 

1、HttpServletRequest类中的相关方法

方法描述
HttpSession  getSession()

在服务器中获取会话,有两种使用模式:

1、参数为false时,如果当前会话不存在直接返回null;如果存在则返回对应的HttpSession对象。

2、参数为false时,如果当前会话不存在就会新建会话保存到哈希表中,并把生成的sessionId返回给浏览器;如果存在则返回对应的HttpSession对象。

Cookie[]  getCookies返回一个数组,包含该次请求中的所有Cookie对象,会自动把Cookie中的格式解析成键值对。

2、HttpServletResponse类中的相关方法

方法说明
vodi  addCookie(Cookie cookie)把指定的cookie添加到响应中,即在响应报文中添加一个Set-Cookie字段

3、HttpSession类中的相关方法

方法描述
Object  getAttribute(String name)返回在session对象中name所对应的value,如果没有name不存在,则返回null
void  setAttrubute(String name,Object value)在session对象中存储一组name-value键值对
boolean  isNew()判断当前是否是新创建出的会话

4、Cookie类中的相关方法

方法描述
String  getName()返回cookie的名称。名称在创建后不能改变
String  getValue()获取cookie对应的值
void  setValue(String new value)设置cookie对应的值

四、代码示例:实现用户登录

实现一个简单的登录流程:用户在登录页面输入用户名和密码,点击提交后,服务器校验用户名和密码都正确后,跳转到主页。

为了实现以上流程,我们需要一个可以填写用户名和密码的登录页面;使用一个Servlet来处理登录请求;使用另一个Servlet来生成主页内容。

1、登录页面

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <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>

注意:这个文件要放在maven项目的webapp目录下 

2、处理登录请求

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  1.获取用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //  2.校验用户名和密码, 假设用户名是: zhangsan  密码是: 12345
        //  注意,如果写成username.equals("zhangsan")或者password.equals("12345")
        //  当username或password为空时,会出现空指针异常
        if("zhangsan".equals(username) && "12345".equals(password)){
            //登陆成功
            //(1)创建新的会话,用户刚登陆成功,之前是没有会话的
            //  getSession这行代码做了三件事情:
            //  a)生成一个sessionId,创建一个HttpSession对象
            //  b)把上述内容以键值对的形式存入到服务器内存中的哈希表
            //  c)把sessionId通过Set-Cookie写到响应中
            HttpSession session = req.getSession(true);
            //(2)设置session对象中的用户信息
            session.setAttribute("username","zhangsan");
            //(3)让响应重定向到主页
            resp.sendRedirect("index");
        }else {
            //登录失败
            resp.setContentType("text/html; charset=uft8");
            resp.setStatus(403);
            resp.getWriter().write("用户名或密码错误");
        }
    }
}

注意:

3、生成主页内容

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        //获取HttpSession对象,登录成功后不需要创建新的HttpSession对象,所以参数填false
        //此处获取到的HttpSession对象就是处理登录请求时创建的HttpSession对象
        HttpSession session = req.getSession(false);
        //判断session对象是否为空
        if(session == null){
            resp.setStatus(403);
            resp.getWriter().write("抱歉,您还没登录");
        }
        String username = (String) session.getAttribute("username");
        resp.getWriter().write("欢迎来到主页"+username);
    }
}

4、查看抓包结果

POST请求

响应:

浏览器就会把响应中Set-Cookie保存到本地:

GET请求

可以发现,访问主页时的GET请求中就会带上刚才的sessionId~

响应:

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

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

相关文章

常用的框架技术-10 Spring Security Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1.Spring Security简介1.1 Spring Security概述1.2 Spring Security历史发展1.3 产品的对比1.3.1 Spring Security1.3.2 Shiro1.4 Spring Security 核心类1.4.1 Auth…

既然有了ES,为何还用ClickHouse——从原理万字总结ClickHouse为何这么快

通过了解 CH 的几大特性了解千亿级企业 ClickHouse 实时处理引擎架构设计、核心技术设计、运行机理全流程。 文章目录1 初始 ClickHouse1.1 什么是 ClickHouse1.2 ClickHouse 的优缺点1.3 谁在用 ClickHouse3 数据引擎3.1 库引擎3.2 表引擎3.3 MergeTree 引擎4 工作原理4.1 数据…

浙大MBA经验分享:在工作生活的缝隙中奋勇上岸

非常高兴可以为大家分享我的浙大MBA备考经验&#xff01;首先针对我的背景简要介绍一下&#xff0c;我本科毕业于省内的普通大学浙江理工大学&#xff0c;学的是设计专业&#xff0c;就业于一家外企公司。在2022年的联考中获得了综合133&#xff0c;英语75&#xff0c;总分是20…

一个简单的音乐网站设计与实现(HTML+CSS)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

常见集群算法解析

Gossip协议 Gossip协议简介 定义 Gossip protocol&#xff0c;又叫 Epidemic Protocol &#xff08;流行病协议&#xff09;&#xff0c;也叫“流言算法” 、 “疫情传播算法”等。其名称已经形象的说明了算法的原理和工作方式 应用场景 分布式网络&#xff0c;无集中管理节…

同花顺l2数据接口的委托队列是什么?

我们都知道股票交易时有买方也有卖方&#xff0c;“买一”通俗理解就是此刻“买”价最“高”即第一的委托集合&#xff0c;卖一则是“卖”价最低的委托集合。 “一”并非指一笔委托或一手股票&#xff0c;它的背后是有多笔报价相同的买入或卖出委托组成&#xff0c;可能是主力…

cesium火箭发射,模型控制,模型动画,模型移动

起因&#xff1a;最近想做模型的动画&#xff0c;结果上网查资料&#xff0c;看到网上好多对于模型控制的文章都有限制。决定还是自己研究下。欢迎大家一起探讨&#xff0c;评论留言。 效果 火箭全部代码在最后 起步 模型控制&#xff0c;第一步当然是需要一个合适的模型&#…

链动2+1模式是否合法合规?它涉及多级传销吗?

根据国家《禁止传销条例》第2条规定&#xff0c;传销是指组织者或者经营者发展人员&#xff0c;通过对被发展人员以其直接或者间接发展的人员数量或者销售业绩为依据计算和给付报酬&#xff0c;或者要求被发展人员以交纳一定费用为条件取得加入资格等方式牟取非法利益&#xff…

【多线程】Thread的interrupt()

一、前言 如果子线程执行完毕终止状态&#xff0c;主线程再去调用interrupt()有什么效果&#xff1f;如果子线程还在执行过程中&#xff0c;主线程调用interrupt()有什么结果&#xff1f; 二、模拟实验 1、模拟子线程执行完毕再调用interrupt() ​ public class Test {publi…

2023年天津美术学院专升本报名考试须知

天津美术学院2023年高职升本科报考须知&#xff08;一&#xff09;专业考试1.报名方法&#xff1a; ①网上报名及缴费&#xff1a; 我校采取网上报名的方式,考生于2022年12月份&#xff08;具体时间关注公众号“高职接本科”另行公告&#xff09;(10:00-22:00)登录网站(网址&am…

web前端期末大作业 html+css学生心理 7页主题网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作方面上运用了html5和css3&#xff0c; 采用了divcss结构、表单、…

Oculus Deeplink

DeepLink 初始化 platform sdk 后设置 应用启动回调判断应用打开的方式发起应用跳转 接收应用跳转 GroupPresence 本文档基于 GroupPresenceSample 脚本逻辑编写&#xff0c;展示通过群组状态发起用户邀请&#xff0c;以及响应对应回调。参考 Oculus 工程 SharedSpaces 使…

【安装教程】vscode安装教程(超详细)

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全、代码重构功能&#xff0c;并且内置了命令行工具和 Git版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置&#xff0c;也可以…

想裁剪视频时长,用电脑怎么裁剪视频时长

大家有没有碰到过这种一种情况&#xff0c;就是我们在社交平台上发布视频时&#xff0c;会因为视频时长过长这个问题而导致视频发布失败。那我们要怎么处理这个问题呢&#xff1f;其实我们可以使用一些剪辑软件&#xff0c;将视频裁剪&#xff0c;只截取视频里面较为精彩的部分…

hadoop集群安装(三):创建同步工具并安装jdk

文章目录说明分享环境创建同步工具编写脚本设置为系统命令安装jdk总结说明 搭建好集群虚拟机&#xff0c;新建同步工具并安装jdk&#xff0c;同步工具方便管理集群&#xff0c;某些操作和一条命令&#xff0c;同步所有节点&#xff0c;增加集群操作效率。 分享 大数据博客列表…

组件之间通过bus中央事件总线进行通信

案例完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

66. SAP ABAP Function Module 的动态调用方式使用方式介绍

在本教程前面的步骤 7,我们介绍了 ABAP Function Module 的基本使用方法: 7. ABAP function module 的使用最近我的知识星球有朋友提问: 大佬,我想问一下动态获取到物料主数据的字段名之后,如何将获取到的字段名去与bapi中的字段名对应起来从而去修改物料主数据中对应的字…

多维时序 | MATLAB实现CNN-GRU多变量时间序列预测

多维时序 | MATLAB实现CNN-GRU多变量时间序列预测 目录多维时序 | MATLAB实现CNN-GRU多变量时间序列预测基本介绍模型特点程序设计学习总结参考资料基本介绍 本次运行测试环境MATLAB2020b&#xff0c;MATLAB实现CNN-GRU多变量时间序列预测&#xff0c;卷积门控循环单元。 模型特…

ComponentAce FlexCompress强大功能

ComponentAce FlexCompress强大功能 FlexCompress是一个高速压缩库&#xff0c;旨在为您的应用程序提供归档功能。此解决方案提供了灵活的压缩和强大的加密算法&#xff0c;使您可以快速轻松地将归档或备份功能集成到程序中。 FlexCompress包括我们新的独特技术&#xff0c;即交…

分片架构设计技巧

Elasticsearch集群设计技巧 ES的基本架构 节点可以配置为不同角色&#xff0c;通过选举Master管理集群Coordinating&#xff1a;协调节点&#xff1b;Master&#xff1a;管理节点&#xff1b;Data&#xff1a;数据存储节点 数据是按照索引分片的&#xff0c;而不是按照节点分片…