前言

说到cookie与session,想必大家都不陌生,写过单机模式下的登录业务逻辑的应该多少都会接触到cookie与session,对于cookie和session,很多同学第一反应就是cookie是存储再客户端浏览器的,而session是放在服务端的

对于网上一大堆的关于对比cookie与session技术的,对于面试来讲,临时突击加以记忆还是可以的,但说到具体的使用以及原理,还是有必要对其做一些深入的理解和探讨

首先我们通过一个具体的小案例来看看cookie与session的由来

业务场景

假如在单机模式下,系统需要先进行登录,然后才能访问其他的资源(接口)

1、环境准备

快速搭建一个springboot工程,提供两个接口,登录接口和获取用户信息接口

@RestController
public class LoginController {@GetMapping("/login")public String login(HttpSession session,HttpServletRequest request,HttpServletResponse response,String username, String password) {if(username.equals("admin") && password.equals("123456")){session.setAttribute("login_info",username);return "login success:" + username;}return "login fail:" + username;}@GetMapping("/info")public String getLoginInfo(HttpSession session,HttpServletRequest request,HttpServletResponse response) {return "info:" + session.getAttribute("login_info");}}

首先调第一个登录接口:http://localhost:8081/login?username=admin&password=123456


接着调第二个获取用户信息接口:

在此,我们注意到,通过F12观察到cookie那一栏中,在登陆成功后会产生一个 :jsessionid = B8F3038B28A83185F50BEB116CB97805

而session与cookie的由来就要从这里说起

2、cookie与session产生的背景

上图是一个非常简单的客户端通过浏览器访问服务端的示意图,由于浏览器发起请求是无状态的,即请求不会直接保存客户端的会话信息,但是服务端为了安全考虑以及记录客户端请求的会话信息,于是需要一种中间介质,可理解为缓存空间,于是各自保存一下本次的会话信息,而对于双方来说,只需要一个凭证用于标识对方的身份,这个标识就是上面的JSESSIONID

对于客户端来说,保存的位置就是浏览器中看到的cookie,而服务端来说,就是session,那么对于上面的两个接口可以拆成下面两步:

  1. 用户登录成功后,服务端保存JESSIONID至session,同时浏览器将JESSIONID保存至cookie,这一步通过浏览器的接口请求的header信息也可以看到,可理解为,客户端登录时顺便携带了这个JESSIONID作为凭证告知服务端,这个就是双方确认身份的凭证


2、再次调用获取用户信息接口时,客户端在请求头中携带上面的JSESSIONID,服务端从session中解析这个JSESSIONID的值,解析到了,就从session中取出来,这里不管是通过断点还是浏览器的请求header都可以反映出这个信息


3、清掉cookie,再次发起调用用户信息接口时,这一次 /info接口携带新的cookie,服务端拿到这个值去session中找并不存在,因此返回了null

4、更换浏览器,在调用了登录接口之后,通过另一个浏览器访问,无法获取到用户的信息,这说明cookie具有禁止跨域的操作

5、重新启动后端服务,在浏览器没有做变更的状态下,再次访问获取用户信息接口,发现未能获取到用户的信息,说明服务端保存session信息是存在于tomcat的进程中

6、使用上述相同的工程再启动一个相同的服务,以端口区分,然后8081端口依次访问登录,获取用户信息,8082获取用户信息(同一个浏览器)


很明显,8081和8082是两个服务对应着不同的进程,8082拿着8081的JSESSIONID去请求第二个服务的用户信息肯定是请求不到结果的

从第六步的演示,我们开始思考一个问题,同一个服务部署多份的情况下(集群部署),如何才能获取到任一台服务上的资源呢?于是就产生了分布式会话技术

最后再简单总结下Cookie(Session)的技术点

  1. Cookie属于客户端(浏览器)技术,session属于服务端(tomcat)技术
  2. 各自记录JSSESIONID的值,作为双方互认的凭证,可用于登录校验中(通过header头中携带cookie的信息,服务端解析Cookie进行前置校验)
  3. Cookie具有不可跨域性
  4. 服务端的session信息的生命周期随着容器的销毁而销毁
  5. Cookie可以在浏览器进行修改、删除
  6. Cookie可以设置有效期(过期时间)

本篇通过案例演示说明了cookie与session的使用和原理,由于从cookie的原理衍生出了众多的分布式会话解决方案,但是其核心原理都是从这里出发,希望能够深入理解,本篇到此结束,最后感谢观看!

Java会话技术之 —— cookie与session相关推荐

  1. 会话技术(Cookie,Session)详解

    概念 功能 方式 概念 一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能 在一次会话的范围内的多次请求间,共享数据 方式 客户端会话技术:C ...

  2. Java Web 七 会话技术 八 Cookie 九 Session

    七 会话技术 打开浏览器,访问服务器中资源,关闭浏览器:这个过程就是会话 分类 * Cookie会话技术:浏览器会话技术* Session会话技术:服务器会话技术 作用 解决ServletContex ...

  3. 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别

    会话技术 – Cookie与Session及其两者的区别 (一)会话技术 一.概述 1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应.从第一个请求开始访问服务器,会话开始,到最后一个页面访 ...

  4. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

    Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...

  5. Flask的会话技术:cookie、session以及session持久化问题

    文章目录 一.会话技术 1.介绍 2.详细过程 二.Cookie 1.Cookie介绍 2.Cookie登陆使用 三.Session 1.Session介绍 2.Session登陆使用 3.Sessi ...

  6. 【读书笔记】深入分析Java Web技术内幕-Cookie与Session

    1. cookie a. cookie的属性项(version1)i. NAME=VALUEii. versioniii. comment--注释项iv. commentURL--服务器为此cooki ...

  7. java day40【会话技术:Cookie 、会话技术:Session 、JSP:入门学习】

    第一章  会话技术 1. 会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. ...

  8. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  9. Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】

    2019独角兽企业重金招聘Python工程师标准>>> 什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直 ...

最新文章

  1. java的static关键字
  2. JS函数的定义与调用方法
  3. linux I/O--I/O多路复用--select总结(三)
  4. 关系数据库是如何工作的
  5. 计算机网络课程设计之电子邮件客户端程序设计与实现
  6. 如何将地址栏打开的图标隐藏_如何制作一款手机主题?这套UI主题图标教程将为你解密!...
  7. math java 计算_Java中的数学计算函数汇总
  8. 使用yum update更新文件系统时不更新内核的方法
  9. VB ListView控件各种操作详解
  10. 2022显卡、CPU天梯图
  11. Aviation turbofan starting model
  12. Zabbix企业微信告警最新版
  13. 直播预告|无监督学习的公平性研究——美国布兰迪斯大学助理教授刘洪甫
  14. bim综合建模插件 进行碰撞检查只需六步!
  15. RabbitMQ与Erlang的版本对应关系
  16. Gitee码云仓库操作步骤---忘了就来看看
  17. 世平信息数据安全合规检测实践论文入选中文核心期刊
  18. 第十周博文作业-小学生考试系统(1)
  19. 分支-04. 出租车计价(15)
  20. VHDL语言仿真激励文件testbench编写指南

热门文章

  1. Guava学习笔记:EventBus(转)
  2. [转]Python yield 使用浅析
  3. ThinkPHP5.1开启调试和错误提示
  4. MySQL介绍及安装(一)
  5. Broker模块划分
  6. 自动化部署操作系统-Kickstart+PXE自动部署
  7. C++11 并发指南------std::thread 详解
  8. Elasticsearch安装及自动同步mysql数据库数据
  9. php中heredoc的使用方法
  10. 我使用的几个Linux终端使用技巧