浅谈 Cookie 和 Session

  • 理解Cookie
  • 理解Session
  • 核心方法
    • 案例-网页登录
      • 1. 编写一个简单的登录页面
      • 2. 编写一个 Servlet 来处理这个登录请求
      • 3. 编写服务器返回主页的逻辑
      • 4. 启动服务器验证
    • Cookie 和 Session 区别

理解Cookie

在前面的 HTTP 协议中,也理解过这个 Cookie,HTTP 协议自身是属于 “无状态” 协议.

"无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但在实际开发中, 我们很多时候是需要知道请求之间的关联关系的.

例如在我们登录网站成功后,在我们第二次去访问的时候服务器就能够知道这个请求是否已经登录过了…

在这里插入图片描述

在这里插入图片描述

上面的令牌通常就是存储在 Cookie 字段中…

谈到在 HTTP协议中的例子:
1: 我们先到医院去挂号,挂号的时候提供身份证,同时得到一张"就诊卡",里面存身份信息,就相当于"令牌"
2: 后面去看病的时候,不管走到那个科室(眼科,鼻科,抓药…)就不需要在把身份证拿出来了,直接拿出就诊卡就可以识别你的身份了
3: 不想要这张卡了,那我们也可以注销这张卡,此时,里面的身份信息,诊断信息就销毁了
4: 又来这个医院看病,可以重新办一张,就又有一个新的"就诊卡了"

理解Session

就诊卡里面存储的就诊信息,就是在 Session(处在服务器) 中存储了
Session叫做会话,因为我们服务器在同一时刻收到的请求是很多的,服务器他就要区分哪个请求是哪个用户的,就是通过这个"令牌来确认关系".

核心方法

HttpServletRequest 类中的相关方法:

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

getSession 方法,既能用于获取到服务器上的会话,也能用于创建会话:
如果参数为 true:会话不存在,则会创建会话,如果会话存在,就会获取
如果参数为false:会话不存在,直接返回 null,会话存在,才会获取

举个例子:
来到一家新医院,先挂号获取到"就诊卡",人家挂号的医生就会问你,你有没有这里的"就诊卡",有就不需要在办了,如果没有,就需要办一张,挂号之后,你就会有一张"就诊卡",同时的医院也会给你开一个档案来存储你的就诊信息(这就是会话),如果这个医院人流量特别多,那这个医院的承载病人的能力是有上限的,这个时候医生就会问你在这里建过档没有,如果建过,才会给你挂号,没有建过的话就不给你挂(就像生娃的时候得提前预约,提前来建个档,因为妇产科人是特别多的,没预约的话,很难挂上号)

在调用 getSession的时候我们还要:

1:创建会话:
首先就是要先获取到请求中 Cookie 里面的 sessionId字段(相当于会话的身份标识),判定这个 sessionId 是否在当前服务器上存在,如果不存在,就会进入到创建会话的逻辑

创建会话,就会创建一个 HttpSession 对象,并且生成一个 sessionId(这个sessionId 是一个很长的数字,通常是用十六进制来表示,能够保证唯一性.),接下来就会把这个 sessionId 作为 key,把这个 Httpsession 对象,作为 value,把这个键值对,给保存到服务器内存的一个"哈希表"(也不一定是他,只是类似这种结构)这样的结构中,再然后服务器就会返回一个 HTTP 响应,把 sessionId 通过 Set-Cookie 字段返回给浏览器,浏览器就可以保存这个 sessionId 到 Cookie 中了,例如,登录gitee
在这里插入图片描述

2: 获取会话:
先获取到请求中的 Cookie 里面的 sessionId字段(会话的身份标识),判定这个sessionId 是否在当前服务器上存在(也就是在 哈希表 中是否存在),如果有,就直接查询出这个 HttpSession 对象,并且通过返回值返回回去

HTTP 请求中的 Cookie 字段就是按照键值对的方式来组织的,这里的这些键值对,大概的格式是使用 ; 来分割键值对,使用 = 来分割键和值,这些键值对都会在请求中通过 Cookie 字段传给服务器,服务器收到请求后,就会进行解析,解析成 Cookie[] 这样的形式

HttpServletResponse 类中的相关方法:

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

响应中就可以根据 addCookie 这个方法来添加一个 Cookie 信息到响应报文中,这里添加进来的键值对,就会作为 HTTP 响应中的 Set-Cookie 字段来表示

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

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

HttpSession 对象:
这个对象本质上也是一个"键值对"的结构.允许程序员往 HttpSession 对象中,存取任意键值对数据.(但是 key 必须是String,value是一个 Object)
在这里插入图片描述

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

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

案例-网页登录

流程:
在这里插入图片描述
约定的前后端交互接口:
在这里插入图片描述

1. 编写一个简单的登录页面

使用 form表单来构造 post 请求:

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

2. 编写一个 Servlet 来处理这个登录请求

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 {// 处理用户请求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);// 初始情况下, 把登录次数设为 0httpSession.setAttribute("count", 0);resp.sendRedirect("index");} else {// 登录失败!resp.getWriter().write("login failed!");}}
}

3. 编写服务器返回主页的逻辑

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 {// 返回一个主页. (主页就是一个简单的 html 片段)// 此处需要得到用户名是啥, 从 HttpSession 中就能拿到.// 此处 getSession 的参数必须是 false. 前面在登录过程中, 已经创建过会话了. 此处是要直接获取到之前的会话.HttpSession session = req.getSession(false);String username = (String) session.getAttribute("username");// 还从会话中取出 count.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>");}
}

4. 启动服务器验证

第一次交互:浏览器从服务器上拿到登录页面:
第二次交互:点击登录之后,就会给服务器发送一个登录请求,服务器就会响应
在这里插入图片描述在这里插入图片描述
第三次交互:浏览器收到 302 响应之后,再次向服务器发起请求,来访问主页
在这里插入图片描述

在这里插入图片描述

Cookie 和 Session 区别

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

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

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

相关文章

session是什么?

目录&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文件存储session 7.分布式session的同步问题 session是啥&#xff1f; 首先&#xff0c;我大致的…

什么是session?

最近在学习node.js 的express框架&#xff0c;接触到了关于session方面的内容。翻阅了一些的博客&#xff0c;学到了不少东西&#xff0c;发现一篇博文讲的很好&#xff0c;概念内容摘抄如下&#xff1a; Session是什么 Session一般译作会话&#xff0c;牛津词典对其的解释是…

session的到底是做什么的?

前言&#xff1a; 今天就来彻底的学一些session是个啥东西&#xff0c;我罗列了几个需要知道的要点&#xff1a; 1.session 是啥&#xff1f; 2.怎么保存的&#xff1f; 3.如何运行&#xff1f; 4.有生命周期吗&#xff1f; 5.关闭浏览器会过期吗&#xff1f; 6.Redis代替文…

Session(超详细)

Session 会话 1.什么是 Session 会话? Session 就一个接口&#xff08;HttpSession&#xff09;。Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个 Session 会话。Session 会话中&#xff0c;我们经常用来保存用户登录之后的…

Session详解(重点)

什么是Session: &#xff08;1&#xff09;服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个Session对象 比如我们现在都去访问百度&#xff0c;我们使用双核浏览器和谷歌浏览器同时访问百度这个网址&#xff0c;百度那边会有两个session,因为浏览器不一样&#x…

Session原理

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a;Java&#xff0c;HTTP协议&#xff0c;session原理 撰写时间&#xff1a;2019-06-17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

Session详解

Session(重点) 什么是Session&#xff1a; 服务器会给每一个用户&#xff08;浏览器&#xff09;创建一个Session对象一个Session独占一个浏览器&#xff0c;只要浏览器没有关闭&#xff0c;这个Session就存在用户登陆之后&#xff0c;整个网站它都可以访问–>保存用户的信…

Session详解,学习Session,这篇文章就够了(包含底层分析和使用)

说明&#xff1a;下面介绍session&#xff0c;我们使用到了游览器抓包&#xff0c;http的知识&#xff0c;如果不了解&#xff0c;请先简单了解下。http介绍&#xff0c;http请求&#xff0c;http响应。因为cookie和session是一对”好兄弟“&#xff0c;我们介绍session也要使用…

移动端VIN码识别技术的出现,为汽配供应链带来便捷

汽配供应链作为汽车后市场一大蓝海&#xff0c;成为众多商家的“必争之地”。在现今人工智能大数据的大环境下&#xff0c;拥抱科技&#xff0c;运用人工智能技术构建智能化数据平台成为提升企业行业竞争力的首选。 VIN码即车架号就是汽车的唯一的身份证&#xff0c;汽车从下线…

harrier 查看查看服务器状态,机油尺检查细节多多,嘉普力汽配工场教你如何正确查看机油尺...

平常我们总是说烧机油、机油消耗、机油增多&#xff0c;很多车主都快得"机油恐惧症"了&#xff0c;时刻担心自己的机油出现问题。既然担心就要查机油&#xff0c;那么你会看机油尺吗&#xff1f;今天&#xff0c;嘉普力汽配工场就教车主朋友们如何正确查看机油尺。 机…

汽车汽配行业B2B电子商务系统营销渠道自动化,综合提升B2B平台交易效率

汽车工业作为国家制造业的支柱之一&#xff0c;是衡量国家工业水平的基本指标。不断完善汽车工业整体的行业规范&#xff0c;促进汽车工业更稳定、更健康的发展&#xff0c;才能有效提升汽车工业的经济作用及影响力。 4S店模式&#xff0c;作为我国一直以来最主要的汽车销售模…

数商云采购系统对账结算功能介绍 | 缩短汽配企业结算周期,提高资金周转效率

近年来随着市场饱和度增加、竞争加剧&#xff0c;特别是信息技术的广泛发展&#xff0c;造成相当程度的平衡打破&#xff0c;使得通过平台化提升汽配供应链整体效率并建立主体间信任的可塑性增强&#xff0c;汽配供应链迎来新的变局。 作为名副其实的中小企业&#xff0c;汽配…

《汽修汽配管理系统——“汽修管理”模块》项目研发阶段性总结

完成模块功能&#xff1a;汽修管理&#xff08;预约维修&#xff0c;客户接待&#xff0c;售后服务&#xff09; 一、 功能实现 汽修管理主要包括预约维修&#xff0c;客户接待&#xff0c;售后服务 预约维修见图一&#xff0c; 该页面可查看老客户的资料&#xff0c;也可对第…

汽车汽配行业智慧供应链系统:提升企业效率,构建SCM平台数字化优势

过去几年&#xff0c;中国汽车产业经历了快速的发展阶段&#xff0c;已经成为全球最大的汽车市场。其中&#xff0c;汽车产业链、供应链有序、畅通的运转对中国汽车行业保持健康平稳发展起到了重要的支撑作用。随着新一轮技术革命到来&#xff0c;中国汽车供应链正面临着无限的…

汽车汽配行业经销商协同系统:实现汽配经销商销售管理全流程数字化

汽车经销商是从事汽车交易&#xff0c;取得汽车所有权的中间商。对于汽车制造企业而言&#xff0c;经销商是重要的资源&#xff0c;如何占有更多的经销商&#xff0c;是决定汽车企业市场开拓能力及成败的关键。随着国内汽车市场的竞争愈加激烈&#xff0c;汽车企业想要站稳脚跟…

成都榆熙教育:拼多多新手开店商品类目怎么选择?

拼多多成立至今已经快6年了&#xff0c;它的发展也是迅猛&#xff0c;某宝用了十几年获得的成就&#xff0c;它仅用6年时间就进行了超越&#xff0c;成为了国内前三的电商平台&#xff0c;因此也吸引了越来越多的个体户和商业户入驻&#xff0c;那么如何开一个拼多多店铺和会花…

百炼智能店店通(车后版)亮相2021AMR北京国际汽保汽配展 开启门店渠道拓展新时代

4月23-27日&#xff0c;由法兰通联展览(北京)有限公司主办的2021中国汽车服务产业新趋势千人大会和2021AMR北京国际汽车维修检测诊断设备、零部件及美容养护展览会(简称AMR北京国际汽保汽配展)落下帷幕。2021年展会展出规模达90,000平方米&#xff0c;为期四天的展期吸引952家参…

微信汽配电商小程序开发功能设计方案

随着互联网的不断发展&#xff0c;在汽车服务市场中的发展也紧跟着市场发展的脚步。汽车配件行业中&#xff0c;通过微信汽配电商小程序就可以实时查看具体的销售情况&#xff0c;以及收入的具体情况。 微信汽配电商小程序功能&#xff1a; 1、商城 商城中可以提供一些汽车周…

汽车汽配电商平台系统解决方案

汽车市场发展简况 —— 自中国改革开放以来&#xff0c;国民收入的逐步提高&#xff0c;截止2016年&#xff0c;中国汽车市场销量已经连续8年蝉联世界第一。据最新数据显示&#xff0c;2017年上半年汽车销量同期上涨3.81%&#xff0c;达到1,335万辆&#xff0c;这还不含二手车…

python 使用pyqt5实现了一个汽车配件记录系统

前言 老姐要求做个记录销售汽车配件得的excel&#xff0c;我觉得太麻烦了&#xff0c;身为程序员的我 必须安排一个方便快捷的系统&#xff0c;安排上&#xff01;&#xff01;&#xff01; 环境要求&#xff1a;python3&#xff0c;pyqt5&#xff0c;pandas 1、实现效果 初…