我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Servlet【 ServletAPI中的会话管理Cookie与Session】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Servlet【 ServletAPI中的会话管理Cookie与Session】

🍒一.回顾Cookie与Session

🍎1.1 Cookie

HTTP 协议自身是属于 “无状态” 协议.

“无状态” 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系.但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了

回忆之前的例子:

  1. 到了医院先挂号. 挂号时候需要提供身份证, 同时得到了一张 "就诊卡"Cookie, 这个就诊卡就相当于患者的 “令牌”.
  2. 后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.
  3. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁了. (类似于网站的注销操作)
  4. 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 “令牌”

此时在服务器这边就需要记录令牌信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作

🍎1.2 Session

服务器同一时刻收到的请求是很多的. 服务器需要清除的区分清楚每个请求是从属于哪个用户, 就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系.在上面的例子中, 就诊卡就是一张 “令牌”. 要想让这个令牌能够生效, 就需要医院这边通过系统记录每个就诊卡和患者信息之间的关联关系.

会话的本质就是一个 “哈希表”, 存储了一些键值对结构. key 就是令牌的 ID(token/sessionId), value 就是用户信息(用户信息可以根据需求灵活设计).
sessionId 是由服务器生成的一个 “唯一性字符串”, 从 session 机制的角度来看, 这个唯一性字符串称为 “sessionId”. 但是站在整个登录流程中看待, 也可以把这个唯一性字符串称为 “token”.sessionId 和 token 就可以理解成是同一个东西的不同叫法(不同视角的叫法)

用户登陆:
●当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端.(例如通过 HTTP 响应中的 Set-Cookie 字段返回).
●客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求中的 Cookie 字段带上).
●服务器收到请求之后, 根据请求中的 sessionId / token 在 Session 信息中获取到对应的用户信息,再进行后续操作.

Servlet 的 Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.

🍎1.3Cookie 和 Session 的区别

●Cookie 是客户端的机制. Session 是服务器端的机制.
●Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
●完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是token / sessionId
●Session 中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递.

🍒二.Servlet会话管理操作

在这里插入图片描述

🍎2.1核心方法

HttpServletRequest 类中的相关方法

方法描述
HttpSession getSession()在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
Cookie[] getCookies()返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对.
Part getPart(String name)获取请求中给定 name 的文件
Collection getParts()获取所有的文件

HttpServletResponse 类中的相关方法

方法描述
void addCookie(Cookie cookie)把指定的 cookie 添加到响应中.

HttpSession 类中的相关方法
一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息.

方法描述
Object getAttribute(Stringname)该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null.
void setAttribute(Stringname, Object value)该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew()判定当前是否是新创建出的会话

Cookie 类中的相关方法
每个 Cookie 对象就是一个键值对.

方法描述
String getName())该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 SetCooke 字段设置给浏览器的)
String getValue()该方法获取与 cookie 关联的值
void setValue(String newValue)该方法设置与 cookie 关联的值

HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie对象.
●通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对.
●通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对.

Part 类方法

方法描述
String getSubmittedFileName()获取提交的文件名
String getContentType()获取提交的文件类型
long getSize()获取文件的大小
void write(String path)把提交的文件数据写入磁盘文件

🍒三.常见案例实现

🍎3.1登录逻辑的实现

我们经常上网查询一些网站什么的,很多网站都会让你先登录,才能使用其中的一些功能,登录完成之后,一般都会跳到一个主页网站,下面我们就来简单地实现一下这一套逻辑。

第一步,约定前后端接口
我们需要实现两套交互逻辑,一是登录跳转,二是获取主页

登录跳转约定:
约定使用POST请求,响应采用302重定向
在这里插入图片描述
获取主页约定:
采用GET请求,响应返回一个页面
在这里插入图片描述
在这里插入图片描述
第二步,编写前端交互页面
我们的重点是来学习登录的逻辑,因此登录的界面不需要很好看很复杂,只要能够有两个输入框和一个提交按钮让我们输入账号密码就行。目标页面如下:
在这里插入图片描述
在pom.xml中引入Servlet依赖

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.1.0</version>    <scope>provided</scope></dependency>

前端代码

<!DOCTYPE html><html lang="ch"><head>    <meta charset="UTF-8">    <title>login</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>

后端代码登陆

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 {    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        req.setCharacterEncoding("utf8");        resp.setCharacterEncoding("utf8");        //获取用户账号        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);            //跳转到目标页面index            resp.sendRedirect("index");        } else {            //登录失败            resp.getWriter().write("登录失败!");        }    }}

登陆后重定向页面响应

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("/index")public class IndexServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //返回一个主页        //获取会话,参数必须是false        HttpSession httpSession = req.getSession(false);        //取出会话信息        String username = (String) httpSession.getAttribute("username");        Integer cnt = (Integer) httpSession.getAttribute("count");        //访问次数加1        cnt++;        //写回到会话中        httpSession.setAttribute("count", cnt);        //构造页面。我们简单构造一下就好        resp.setContentType("text/html; charset=utf8");        resp.getWriter().write("

欢迎您!" + username + "

这个主页已经被访问了" + cnt + "次

"
); }}

在这里插入图片描述

🍎3.2上传文件

前端代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>file</title></head><body><form action="upload" method="post" enctype="multipart/form-data">    <input type="file" name="myfile">    <input type="submit" value="提交"></form></body></html>

后端代码

import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import java.io.IOException;@MultipartConfig@WebServlet("/upload")public class UploadServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //获取Part对象        Part part = req.getPart("myfile");        //输出文件信息        //文件名        System.out.println("文件名:" + part.getSubmittedFileName());        //文件类型        System.out.println("文件类型:" + part.getContentType());        //文件大小        System.out.println("文件大小:" + part.getSize());        //将文件写入磁盘        part.write("D:\\上传文件");        //返回响应        resp.setContentType("text/html; charset=utf8");        resp.getWriter().write("上传成功!");    }}

在这里插入图片描述
在这里插入图片描述

来源地址:https://blog.csdn.net/m0_59735420/article/details/127822889

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Servlet【 ServletAPI中的会话管理Cookie与Session】

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Servlet【 ServletAPI中的会话管理Cookie与Session】

Servlet【 ServletAPI中的会话管理Cookie与Session】 🍒一.回顾Cookie与Session🍎1.1 Cookie🍎1.2 Session🍎
2023-08-18

基于Cookie与Session的Servlet API会话管理操作

这篇文章主要为大家介绍了基于Cookie与Session的Servlet API会话管理操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

PHP Session 跨域的会话管理与身份验证

引言:在现代的网络应用开发中,会话管理和身份验证是非常重要的安全措施。PHP提供了一个方便而强大的会话管理机制——PHP Session。然而,当应用程序需要跨域访问时,会话管理和身份验证就变得更加复杂。本文将介绍如何使用PHP Sessi
2023-10-21

如何理解Flask中的Cookie与session

如何理解Flask中的Cookie与session,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Cookie的使用1、什么是Cookie我们都知道,HTTP
2023-06-21

Ubuntu下Privoxy的会话管理与持久化

在Ubuntu下,使用Privoxy进行会话管理和持久化可以通过以下步骤实现:安装Privoxy:如果你还没有安装Privoxy,可以通过以下命令进行安装:sudo apt-get updatesudo apt-get install
Ubuntu下Privoxy的会话管理与持久化
2024-10-18

ASP中会话管理的方法是什么

在ASP中,会话管理可以通过以下方法实现:使用Session对象:ASP提供了Session对象来存储和管理会话数据。可以通过Session对象存储用户的会话数据,并在整个会话期间保持数据的状态。使用Cookie对象:ASP也可以使用Coo
ASP中会话管理的方法是什么
2024-04-03

如何模仿J2EE的session机制实现App后端会话信息管理

这篇文章主要为大家展示了“如何模仿J2EE的session机制实现App后端会话信息管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何模仿J2EE的session机制实现App后端会话信息管
2023-05-30

如何处理PHP开发中的会话管理和状态维护

随着互联网的发展,网站和应用程序的交互变得越来越复杂,用户需求也不断增加。在这个过程中,会话管理和状态维护变得至关重要。PHP作为一种常用的服务器端脚本语言,具有强大的会话管理和状态维护能力。本文将介绍在PHP开发中如何处理会话管理和状态维
2023-10-21

Android中简单的电话管理与短信管理App编写实例

android电话管理器(TelephonyManger)实例: TelephonyManger是管理电话状态、网络信息的服务类。 添加权限:2022-06-06

如何解决PHP开发中的会话管理和状态维护

对于PHP开发者来说,会话管理和状态维护是非常重要的一部分。通过会话管理,我们可以在多个页面间共享数据,保持用户登录状态,以及实现购物车、表单数据的持久化等功能。在本文中,我们将探讨如何解决PHP开发中的会话管理和状态维护问题,并提供一些具
2023-10-21

PHP框架中的用户会话管理:安全、高效、定制化

php框架通过加密会话id、https传输和会话超时确保会话安全性。通过会话缓存、压缩和按需存储优化会话效率。框架提供定制化选项,包括会话存储驱动、会话配置和会话数据管理。PHP框架中的用户会话管理:安全、高效、定制化在Web应用程序中,
PHP框架中的用户会话管理:安全、高效、定制化
2024-05-23

小程序中的会话管理和业务服务器怎么合并

这篇文章主要介绍“小程序中的会话管理和业务服务器怎么合并”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序中的会话管理和业务服务器怎么合并”文章能帮助大家解决问题。文件迁移因为两台服务器的镜像是不
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录