Cookie 和 Session

在这里插入图片描述

前言

虽然在默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系,但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的,例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了。而上面的操作则是通过 cookie 和 session 来完成的。

cookie 和 session的作用

在这里插入图片描述
在很多网站中,你每次进行一些操作的时候,都需要判断你是否是登录状态,如果没有登陆的话就不能进行一些操作。当用户登录成功之后,服务器会在服务器这里生成一个 sessionId: session 类似这样的键值对的结构,然后存储在服务器本地,并且在响应的时候将这个 sessionId 给携带上,当浏览器接收到这个请求并且拿到这个 session 的时候就会将这个 sessionId 存储在cookie 中。下次向服务器发送请求的时候就会将这个 cookie 和请求数据包一起发送给服务器,当服务器拿到这个 cookie 中的 sessionId 的时候就会根据这个 sessionId 找到对应的 session 从而完成一系列的操作。

给大家举个例子:当我们第一次去某个医院的时候,医院会给根据你提供的身份证为我们开一个就诊卡,这个身份证就相当于我们的用户名和密码,这个就诊卡就相当于 cookie,并且与之对应的,通过这个就诊卡医生可以查询到你的病史、余额等等这些信息,当你去其他的科室看病的时候,就不再需要我们提供身份证了,而是就诊卡;而医院这边呢就会通过你提供的就诊卡,也就是 cookie,来获取到你的个人信息,也就是 session,这样你就能查看到该病人的一些相关信息。

在这里插入图片描述

HttpServletRequest和HttpServletResponse中与cookie和session相关的方法

HttpServletRequest 类中的相关方法

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

HttpServletResponse 类中的相关方法

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

Cookie

每个 Cookie 对象就是一个键值对。

方法描述
String getName()该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 SetCooke 字段设置给浏览器的)
String getValue()该方法获取与 cookie 关联的值
void setValue(String newValue)该方法设置与 cookie 关联的值
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/cookie")
public class cookie extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf8");Cookie[] cookies = req.getCookies();StringBuilder sb = new StringBuilder();for (int i = 0; i < cookies.length; i++) {String name = cookies[i].getName();String value = cookies[i].getValue();sb.append(name + ": " + value + "<br>");}resp.getWriter().write(sb.toString());}
}

在这里插入图片描述

HttpSession

HttpSession 对象中也包含很多的键值对,我们可以获取或者添加一些键值对。

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

attribute 就是属性的意思。

这里我们先用 postman 发送一个 get 请求,让服务器添加一个 cookie,然后再用 postman 发送一个 post 请求查看我们的请求中是否有 cookie。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;class Message {public String name;public String gender;public Message(String name, String gender) {this.name = name;this.gender = gender;}@Overridepublic String toString() {return "Message{" +"name='" + name + '\'' +", gender='" + gender + '\'' +'}';}
}
@WebServlet("/test")
public class Test extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("name","zhangsan");resp.addCookie(cookie);resp.getWriter().write("ok");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf8");HttpSession httpSession = req.getSession(true);resp.getWriter().write(String.valueOf(httpSession.isNew()));Message message = new Message("zhangsan", "man");httpSession.setAttribute("cookie1", message);Message m = (Message)httpSession.getAttribute("cookie1");resp.getWriter().write(m.toString());}
}

在这里插入图片描述
在这里插入图片描述
这是post请求的数据包。

在这里插入图片描述
可以看到当我们发送 post 请求的时候,我们抓取到的请求数据包中是存在我们刚才get请求时创建的 cookie 的,不仅如此,cookie 中还有一个 jsession 这个键值对,这就是服务器在服务器本地生成的一对sessionId-session键值对之后返回给浏览器的sessionId,浏览器将这个 sessionId 给存储到了 cookie 中。

使用cookie和session实现一个简单的登录功能

当了解了cookie和session的基本使用,那么我们服务器就可以根据浏览器传来的cookie中的sessionId,得到对应的session对象,然后根据session对象中的相关属性来判断你这个账号的登录状态,如果你当前处于未登录的话,就提示你当前未登录,如果登录了的话,就显示出欢迎词。

使用form表单构造HTTP请求

我们这里的构造HTTP请求的界面很简单就是几个简单的输入框。

<!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="text" 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 {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf8");String username = req.getParameter("username");String password = req.getParameter("password");if (!"zhangsan".equals(username) || "123".equals(password)) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("对不起,您输入的用户名或者密码不正确");return;}HttpSession httpSession = req.getSession(true);httpSession.setAttribute("username", username);httpSession.setAttribute("loginTime", System.currentTimeMillis());resp.sendRedirect("index");}
}

判断登录信息

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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession httpSession = req.getSession(false);resp.setContentType("text/html; charset=utf8");if (httpSession == null) {resp.getWriter().write("对不起,您当前未登录");return;}String username = (String)httpSession.getAttribute("username");Long loginTime = (Long)httpSession.getAttribute("loginTime");String responBody = "欢迎你" + username + "上次登录时间为" + loginTime;resp.getWriter().write(responBody);}
}

效果展示

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发中对图片的加工处理的一些个人思考和总结

前言&#xff1a; 最近在公司做项目的时候&#xff0c;有一个业务场景就是同一张图片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其实理解起来也很简单&#xff0c;就以大家熟悉的微信头像而言&#xff0c;我们在正常使用的情况下&#xff0c;一个微信头像的大…

介绍一款低成本的制造业工厂生产管理MES软件

传统的MES是一个相对封闭的制造执行管理系统&#xff0c;它只是适用于工厂内部使用&#xff1b;而且&#xff0c;很多时候&#xff0c;同一个企业的MES是分离的。 如&#xff1a;集团多工厂&#xff0c;上MES只是在车间生产线上&#xff0c;上一套生产数据采集软件&#xff1b…

「Java开发中文指南」IntelliJ IDEA插件安装(一)

IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…

canvas扩展001:利用fabric绘制图形,可以平移,旋转,放缩

canvas可以使用Fabric.js来做扩展&#xff0c;您可以在画布上创建和填充对象&#xff1b; 诸如简单几何形状之类的对象 - 矩形、圆形、椭圆形、多边形或由数百或数千条简单路径组成的更复杂的形状。 然后&#xff0c;您可以使用鼠标缩放、移动和旋转这些对象&#xff1b; 修改它…

什么手机30万?VERTU唐卡手机顶配56.8万

近日,一则新闻在社交媒体上引发了广泛关注。一名男子遗失了一部价值30万的VERTU唐卡定制款手机,而一位女士在捡到这部手机后,误以为是一部普通的老年机,引发了种种误会。30万的手机是什么牌子?VERTU唐卡手机浮出水面 据了解,这部VERTU唐卡定制款手机是一款豪华的奢侈品定制手机…

首个央企量子云计算项目,中标!

6月29日&#xff0c;北京玻色量子科技有限公司&#xff08;简称“玻色量子”&#xff09;成功中标中国移动云能力中心“2023—2024年量子算法及光量子算力接入关键技术研究项目”&#xff0c;这是玻色量子继与移动云签订“五岳量子云计算创新加速计划”后&#x1f517;&#xf…

【2021研电赛】多路超高清摄像头控制器设计|HDC队

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 1.作品简介 超高清摄像头广泛应用于各个领域&#xff0c;越来越多的应用场景需要多摄像头协同工作。然而&#xff0c;市面上现有的摄像头往往采用单个镜头&#xff0c;缺少…

Android : AlertDialog对话框、单选、多选、适配器-简单应用

示例图&#xff1a; 1 &#xff1a;创建 AlertDialog.Builder 对象&#xff1b; 2 &#xff1a;调用 setIcon() 设置图标&#xff0c; setTitle() 或 setCustomTitle() 设置标题&#xff1b; 3 &#xff1a;设置对话框的内容&#xff1a; setMessage() 还有其他方法来指定显示…

nvm-切换node版本工具安装-方便好用

去官网下载&#xff1a; https://github.com/coreybutler/nvm-windows#installation--upgrades 网站进去后点击下载&#xff0c;点击那个exe文件就下载本地&#xff0c;然后双击安装 安装nvm 就直接按照窗口提示的下一步就行&#xff0c;如果改了某些地方会不成功&#xf…

(保姆级教程)Mysql中事务的概念,什么是事务,如何使用事务,以及事务的隔离级别,什么是脏读、幻读,代码演示

继续讲解 Mysql 数据库中最重要的一个概念&#xff1a;事务 文章目录 事务1.1 什么是事务1.2 执行原理1.3 如何操作事务1.4 事务的特点&#xff08;ACID原则&#xff09;1.5 事务并发1.6 事务隔离级别1.6.1 事务并发问题操作演示1.6.2 脏读演示1.6.3 不可重复读演示1.6.4 幻读演…

人机交互模块的发展

人机交互&#xff08;Human-Computer Interaction&#xff0c;HCI&#xff09;是指人与计算机之间进行交互和信息交换的过程。人机交互模块的发展经历了多个阶段&#xff0c;从早期的命令行界面到现在多样化的交互方式&#xff0c;不断发展和创新。以下是一些人机交互模块的发展…

[Linux] 冯诺依曼体系结构 与 操作系统

文章目录 1、冯诺依曼体系结构2、操作系统 1、冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置&#xff0c;因此程序指令和数据的宽度相…