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开发,…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...