Cookie和Session的API、登录页面
目录
一、Cookie 和 Session
1、HttpServletRequest 类中的相关方法
2、HttpServletResponse 类中的相关方法
3、HttpSession 类中的相关方法
4、Cookie 类中的相关方法
二、网页登录
1、约定前后端交互接口
2、编写一个简单的登录页面
3、编写一个Servlet 来处理这个登录请求。
4、编写服务器端返回主页的逻辑
5、效果展示
一、Cookie 和 Session
在请求响应(header)中介绍过。HTTP详细介绍
在Servet 中,对于 Cookie 和 Session 都有很好的支持,因此就可以通过这些API来完成会话管理的操作。以下介绍几个核心方法。
1、HttpServletRequest 类中的相关方法
| 方法 | 描述 |
| HttpSession getSession() | 在服务器中获取会话。 参数若为 true,则当不存在会话时新建会话; 参数若为false,则当不存在会话时返回 null。 |
| Cookie[] getCookies() | 返回一个数组,包含客户端发送该请求的所有 Cookie 对象。 会自动把 Cookie 中的格式解析成键值对。 |
在调用 getSession 时具体做的事情:
(1)创建会话
首先先获取到请求中 cookie 里面的 session 字段(相当于会话的身份标识),判定这个 session 是否在当前服务器上存在,如果不存在,则进入创建会话逻辑。
创建会话,会创建一个 HttpSession 对象,并且生成一个 session(是一个很长的数字,通常用十六进制来表示,能够保证唯一性), 接下来就会把这个 session 作为 key,把这个 HttpSession 对象作为 value ,把这个键值对给保存到 服务器内存 的一个 “ 哈希表 ” 这样的结构中。(实际的实现不一定真是哈希表,但是一定是类似的能存储键值对的结构,并且这个数据是在内存中的)
(2)获取会话
先获取到请求中的 cookie 里面的 session 字段(也就是会话的身份标识),判定这个 session 是否在当前服务器上存在(也就是在这个哈希表中是否有),如果有,就直接查询出这个 HttpSession 对象,并通过返回值返回。
getCookie :
返回值是一个 Cookie 类型的数组,每个元素是一个 Cookie 对象,每个 Cookie 对象有包含了两个属性 name 和 value 。(还是键值对)
Http 请求中的 cookie 字段就是按键值对的方式在组织的,这里的键值对使用 ;来分割多个键值对,使用 = 来分割键和值。 这些键值对都会在请求中通过 cookie 字段传给服务器,服务器收到请求后,就会进行解析,解析成上述看到的 Cokkie[] 这样的形式。
2、HttpServletResponse 类中的相关方法
| 方法 | 描述 |
| void addCookie(Cookie cookie) | 把指定的 cookie 添加到响应中 |
响应中就可以根据这个 addCookie 这个方法,来添加一个 Cookie 信息到响应中。这里添加进来的键值对,就会作为 HTTP 响应中的 Set-Cookie 字段来表示。
3、HttpSession 类中的相关方法
一个 HttpSession 对象里包含多个键值对(key:String;value:Object),我们可以往 HttpSession 中存任何我们需要的信息。

| 方法 | 描述 |
| Object getAtttribute(String name) | 该方法返回在该 session 会话中具有指定名称的对象。 如果没有指定名称的对象,则返回 null (取键值对) |
| void setAttribute(String name, Object value) | 该方法使用指定的名称绑定一个对象到该 session 对象 (存键值对) |
| boolean isNew() | 判断当前是否是新创建出的会话 |
4、Cookie 类中的相关方法
每个Cookie 对象就是一个键值对。
| 方法 | 描述 |
| String getName() | 该方法返回 cookie 的名称。 名称在创建后不能改变(这个值是 Set-Cookie 字段设置给浏览器的) |
| String getValue() | 该方法获取与 cookie 关联的值 |
| void setValue(String newValue) | 该方法设置与 cookie 关联的值 |
Cookie 这里是可以保存任意自定制的键值对的。
如果是一般的键值对,直接通过 getCookies 来获取。
如果是特殊的键值对(表示 session 的键值对),不需要使用 getCookies,直接使用 getSession 就自动帮我们从 Cookie 中取 session 了。
二、网页登录
先创建 Servlet 项目,并创建好目录。

1、约定前后端交互接口
有两组交互:登录,获取主页
登录的交互:
请求:
POST/login HTTP/1.1
Content-Type:application/x-www-form-urlencoded
username=zhangsan&password=123
响应:
HTTP/1.1 302
Location:index
获取主页的交互:
请求:
GET/index HTTP/1.1
响应:
HTTP/1.1 200 OK
Content-Type:text/html
[ body 中时一个简单的 html 片段,直接有浏览器进行展示]
2、编写一个简单的登录页面
使用 form 表达来构造post请求。
<!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>
3、编写一个Servlet 来处理这个登录请求。
loginServlet.java:
处理第一个登录交互的请求。保证跳转到主页(index)的时候,服务器要能够获取到当前用户的身份信息,因此要创建好一个 Session 对象,并填入身份信息。
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;/*** Created with IntelliJ IDEA.* Description:实现登录页面* User: WangWZ* Date: 2023-05-05* Time: 15:57*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理用户请求String username = req.getParameter("username");String password = req.getParameter("password");//判定用户名和密码是否正确//正常来说这个判定操作是要放在数据库中进行存取的//此处为了简单,就直接在代码里写死了,假设有效的用户名和密码是:“zhangsan” 和 “123”if ("zhangsan".equals(username) && "123".equals(password)) {//登录成功!//创建会话,并保存必要的身份信息HttpSession httpSession = req.getSession(true);//往会话中存储键值对,必要的身份信息httpSession.setAttribute("username",username);httpSession.setAttribute("count",0);resp.sendRedirect("index");} else {//登录失败!resp.getWriter().Writer("登录失败!");}}
}
4、编写服务器端返回主页的逻辑
IndexServlet.java:
第二次交互。
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;/*** Created with IntelliJ IDEA.* Description:* User: WangWZ* Date: 2023-05-05* Time: 17:25*/
@WebServlet("/index")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//返回一个主页(主页就是一个简单的 html 片段)//此处需要得到用户名是啥,从 HttpSession 中就能拿到//此处的 getSession 的参数必须是 false,前面在登录的过程中,已经创建过会话了,此处要直接获取到之前的会话HttpSession session = req.getSession(false);String username = (String) session.getAttribute("username");Integer count = (Integer) session.getAttribute("count");count += 1;session.setAttribute("count",count);resp.setContentType("text/html;charset=utf8");resp.getWriter().write("<h3>欢迎你 " + username +"这是你访问的第 " + count + "次 </h3>");}
}

5、效果展示


点击页面刷新


第一次交互:
请求
响应
第二次交互:
请求
响应
相关文章:
Cookie和Session的API、登录页面
目录 一、Cookie 和 Session 1、HttpServletRequest 类中的相关方法 2、HttpServletResponse 类中的相关方法 3、HttpSession 类中的相关方法 4、Cookie 类中的相关方法 二、网页登录 1、约定前后端交互接口 2、编写一个简单的登录页面 3、编写一个Servlet 来处理这个…...
C++数据结构:手撕红黑树
目录 一. 红黑树的概念及结构 二. 红黑树节点的定义 三. 红黑树节点的插入 3.1 初步查找插入节点的位置并插入节点 3.2 红黑树结构的调整 3.3 红黑树节点插入完整版代码 四. 红黑树的结构检查 4.1 检查是否为搜索树 4.2 检查节点颜色是否满足要求 附录:红黑…...
Spring IoC 深度学习
Io回顾 IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Jav…...
C语言从入门到精通第17天(指针和数组联用)
指针和数组联用 不同类型指针变量之间的区别数组的指针指针数组 不同类型指针变量之间的区别 在了解数组和指针联用之前,我们先对指针变量进行补充。我们对比一下int *p1和char *p2的区别? 相同点: 都是指针变量都是用来保存一个内存地址编…...
Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局
1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…...
音视频八股文(10)-- mp4结构
介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 。它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流、海报、字幕和元数据等。(顺便⼀提,⽬前流⾏的视频编码格式AVC/H264 定义在MPEG-4 Part 10)…...
python算法中的深度学习算法之深度信念网络(详解)
目录 学习目标: 学习内容: 深度信念网络 Ⅰ. 预训练 Ⅱ. 微调 学习目标: 一分钟掌握 python算法中的深度学习算法之深度信念网络 入门知识...
SPSS如何绘制常用统计图之案例实训?
文章目录 0.引言1.绘制简单条形图2.绘制分类条形图3.绘制分段条形图4.绘制简单线图5.绘制多重线图6.绘制垂直线图7.绘制简单面积图8.绘制堆积面积图9.绘制饼图10.绘制直方图11.绘制简单散点图12.绘制重叠散点图13.绘制矩阵散点图14.绘制三维散点图15.绘制简单箱图16.绘制分类箱…...
打动人心的故事 | 如何利用文案在Facebook上塑造品牌形象
在当今的数字营销时代,文案已经成为各大平台上不可或缺的元素之一。在Facebook上,一个好的文案能够为品牌带来巨大的曝光率和用户黏性,甚至可以改变用户对品牌的看法。那么,如何利用文案在Facebook上打动人心,塑造品牌…...
什么是模糊控制?
模糊控制设计原理 1、传统控制系统和模糊控制系统 传统控制系统结构: 控制目的:通过控制器调节控制信号u,使输出信号y达到要求 模糊控制系统结构: 与传统控制系统的差异:用模糊控制器FC(Fuzzy Controller&…...
仿抖音开发需要注意的问题
一、版权问题 仿抖音开发需要注意版权问题,包括内容的版权和软件的版权。在开发的过程中,不要直接抄袭他人的作品,应该注重保护知识产权。 二、安全性问题 仿抖音开发需要重视应用的安全性问题,避免应用在使用过程中发生安全漏…...
如何根据期刊缩写查找期刊?
英文论文写作中,经常会插入参考文献。参考文献中的期刊名称,时常需要使用缩写。或者是手头有期刊缩写后的名称,但是有时候,查了半天也查不到期刊期刊全称,费时费力让人崩溃。今天就给各位学者老师总结一些查询期刊缩写…...
数据发送流程
在发送模式下,UART 的串行数据发送电路主要包括一个发送移位寄存器(TSR),TSR 功能是将数据 逐个移位送出。待发数据必须先写到发送缓冲区中。 TXIFx 是发送中断标志位,可配置为发送缓冲区空或TSR 空。 数据的发送支持7bit 、8bit 或9bit 数据…...
堆及其应用
堆是一种基于树结构的数据结构,通常用于实现优先队列。堆分为最大堆和最小堆两种类型,最大堆的每个节点的值都大于等于其子节点的值,最小堆则相反,每个节点的值都小于等于其子节点的值。 基础算法操作包括: 1. 插入元…...
MySQL数据库备份脚本
PS:此脚本简单易懂,根据实际情况修改个别参数测试后即可使用,如有错误请指出! 1.MySQL数据库备份脚本 #!/bin/bashuser pw ip dateYdate "%Y" date2date "%Y%m%d" date3date "%Y%m%d %H:%M" date…...
【2023 · CANN训练营第一季】应用开发深入讲解——第三章应用调试
学习资源 日志参考文档 应用开发FAQ 日志主要用于记录系统的运行过程及异常信息,帮助快速定位系统运行过程中出现的问题以及开发过程中的程序调试问题。 日志分为如下两大类: 系统类日志:系统运行产生的日志。主要包括: Contro…...
黎曼几何与黎曼流形
目录 0.黎曼几何 1. 欧几里得几何与黎曼几何的区别 2.黎曼流形 3.黎曼距离 4.切空间 5.黎曼均值 6. SPD矩阵如何形成黎曼流型 7.切线空间映射 8.同余变换和同余不变 9.黎曼对齐 科普性笔记,做了解,不深入。 0.黎曼几何 黎曼几何是一种基于欧几…...
lua | 运算符与字符串
目录 一、运算符 算数运算符 关系运算符 逻辑运算符 其他运算符 运算符优先级 二、字符串 转义字符 方法与用途 字符串截取 字符串大小转换 字符串查找与反转 字符串格式化 字符与整数的转换 匹配模式 本文章为笔者学习分享 学习网站:Lua 基本语法 | …...
NetBackup 10.2 新功能介绍:PostgreSQL 和 MySQL 自动化恢复达成
NetBackup 10.2 新功能介绍:PostgreSQL 和 MySQL 自动化恢复达成 原文来自:VERITAS 中文社区 2023-04-27 在执行恢复任务时,手动提取、更新数据库和实例并将其附加到 PostgreSQL 和 MySQL 是常规操作。而在最新的 NetBackup 10.2 版本中&am…...
ADRV9002官方例程开发过程中遇到的问题
开发环境:Vivado2021.2 HDL版本:hdl_2021_r2 GitHub - analogdevicesinc/hdl at hdl_2021_r2 no-OS版本:no_OS-2021_R2 GitHub - analogdevicesinc/no-OS at 2021_R2 (PS:也可以用Vivado2019.1开发,…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...



