Java 实战介绍 Cookie 和 Session 的区别
HTTP 是一种不保存状态的协议,即无状态协议,HTTP 协议不会保存请求和响应之间的通信状态,协议对于发送过的请求和响应都不会做持久化处理。

无状态协议减少了对服务压力,如果一个服务器需要处理百万级用户的请求状态,对服务器的压力无疑的是巨大的。
无状态的 HTTP 由于其简单和易用性,应用比较管广泛。而且早期的 Web 服务对于状态的需求也很低,所以应用场景也比较广泛。
随着 Web 的不断发展,越来越多的服务需要记录用户的登录状态,比如购物、聊天、论坛服务,请求都是无状态的服务,服务器就无法识别是 HTTP 请求的用户信息,所以就需要一种技术保存用户的状态,也就 Cookie 技术,有了 Cookie 的 HTTP 协议通信,就能保存状态了。
Cookie
在无状态协议不受影响的基础上,通过引入 Cookie 来记录状态,这样既不会影响原有的功能,也可以解决请求状态问题。Cookie 是当你浏览网页,通过服务器记录你的用户名,密码等网页信息。
Cookie 是由服务端创建,客户端向服务发送请求后,服务端通过响应报文的Set-Cookie 字段将 Cookie 信息返回给客户端,客户端自动保存 Cookie。Cookie 会标记来源、有效期、路径等信息。客户端再次请求该服务端时,会自动将 Cookie 添加到请求报文中(Request Header),服务端就能通过传递的 Cookie 识别客户端的信息。
1.没有 Cookie 信息的请求:

2.再次(有了Cookie信息后)发送请求:

Cookie 简单实践
使用 Spring Boot 创建简单的 Controller,当客户端传递的参数 a 有值时,服务端才添加 Cookie:
@GetMapping("/cookie")
@ResponseBody
public String cookie(String a, HttpServletRequest request, HttpServletResponse response) {
if (a != null) {
Cookie cookie = new Cookie("name",a);
response.addCookie(cookie);
}
return "ok";
}
首先使用 Chrome 浏览器发送请求http://localhost:8080/cookie:

返回结果没有 Cookie。
再发送带有 a 参数的请求http://localhost:8080/cookie?a=jeremy:

返回 Cookie 都存在 Set-Cookie 字段中,客户端会自动保存 Cookie。
再次发送相同的请求http://localhost:8080/cookie?a=jeremy:

请求会将客户端的 Cooike 自动添加到请求报文中,此时服务端也能接收到 Cookie信息:

Session
Session 是服务端保存用户状态的一种机制,当用户访问网站时,服务端会为每个用户创建唯一个会话标识,并根据用户登录请求创建和存储会话信息,客户端再次请求时,就能从服务端获取会话信息了。
Session 简单实践
在 Java 中的 Servlet 提供 HttpSession 的接口来操作会话信息,只要有以下几个方法:
- public HttpSession getSession() 获取会话信息,如果不存在就创建会话信息。
- public String getId() 获取唯一的会话 id。
- public void invalidate() 将会话信息失效,一般注销时候使用。
HttpSession 接口通过 getAttribute() 和 setAttribute() 来获取和设置会话信息,
下面创建两个方法,session() 方法获取会话判断用户是否登录,login() 方法添加会话信息。
@GetMapping("/session")
@ResponseBody
public String session(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
Boolean login =(Boolean) session.getAttribute("login");
String loginInfo;
if (login == null) {
loginInfo = "未登录";
} else {
loginInfo = "已登录";
}
return "session id :" + session.getId() + ":" + loginInfo;
}
@GetMapping("/login")
@ResponseBody
public String login(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("login",true);
return "ok";
}
先请求 http://localhost:8080/session,返回如下信息:
session id :F3C560208A54E3D5B465CDEBE7419817:未登录
多次发送请求,session id 是一致的,说明 session id是在会话周期之内(浏览器不关闭)都是不变的。
然后请求登录接口 http://localhost:8080/login,设置了会话信息之后,再请求 http://localhost:8080/session:返回如下信息:
session id :F3C560208A54E3D5B465CDEBE7419817:已登录
同一个用户请求,服务端会创建唯一的会话,在请求的生命周期之内,会话 id 一直不改变。session 会话由服务端添加后,后续请求就能获取到会话信息,会话信息只存储在服务端。
Cookie 和 Session 的区别
Cookie 是存储在客户端上小型文本,是由服务端创建,然后通过响应报文的 Set-Cookie 字段返回给客户端。客户端每次请求服务端吗,浏览器都会将 Cookie 信息发送给服务端,服务端根据 Cookie 来识别用户的会话信息。Cookie 有如下几个特点:
- 存储在客户端
- 可以被客户端修改和删除
- 数据比较小,例如用户基本信息、购物信息
- 可以设置过期时间。
Session 是服务端存储会话信息,当客户端请求服务端时,服务端会被每个用户创建一个唯一的会话(Session id)标识,并在服务端设置和存储会话信息,并在后续的请求,可以获取到会话信息,主要有如下特点:
- 存储在服务端,客户端无法修改和删除
- 数据比较大,比如用户的信息,登录记录。
- 通常依赖 Cookie 和客户端进行数据交换。
Cookie 和 Session 的主要区别:
- 储存位置:Cookie 存储在客户端,Session 存储在服务端上。
- 数据大小:Cookie 通常比较小,Session 通常存储较大的数据。
- 安全性:Cookie 可以通过 js 设置和修改,也可能通过抓包工具修改,可以轻易的被修改,Cookie 安全性差,很多浏览器也禁用了 Cookie,Cookie 使用也不多。Session 的设置和修改都在服务端,安全性相对 Cookie 高很多。
在实际的使用场景上,Cookie 和 Session 也会结合使用,服务端使用Session记录用户的会话信息,而将会话信息存储在 Cookie 中,这样可以减少服务端的压力。
Java 实战介绍 Cookie 和 Session 的区别的更多相关文章
- java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别
1.什么是跳表? 跳表实际上就是多层链表 跳表可用在让链表的元素查询接近线性时间 代码结构及java实现参考博客园随笔 2.判断两棵二叉树是否相同?(结构相同,内容相同) 思路:(1)先定义树节点Tr ...
- Cookie与Session的区别-总结很好的文章
Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...
- cookie和session的区别,session的生命周期,
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- cookie 和session 的区别详解
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- JavaWeb之Cookie和Session的区别
Cookie和Session的区别 一.cookie机制和session机制的区别 ********************************************************** ...
- cookie 和session 的区别(转)
二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有 ...
- (转)cookie和session的区别
转自 http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html http://justsee.iteye.com/blog/15 ...
- cookie和session的区别及session的生命周期
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录 ...
- Cookie与Session的区别与联系及生命周期
Cookie与Session的区别与联系及生命周期 一.Session与Cookie介绍 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会 ...
- 理解Cookie和Session的区别及使用
资料一: Cookie和Session的区别 共同之处: cookie和session都是用来跟踪浏览器用户身份的绘画方式. 区别: cookie数据保存在客户端,session数据保存在服务端. s ...
随机推荐
- [C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程
之前我们介绍过vector, queue, stack,map,set,今天我们介绍另外一个stl容器:bitset. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通 ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——24.加载并运行loader
学习操作系统原理最好的方法是自己写一个简单的操作系统. 之前我们在电脑的启动过程中介绍过boot程序的主要任务就是加载并运行loader程序,本讲我们就来实现. 本讲代码文件共2个: boot.asm ...
- Java:如何在PowerPoint幻灯片中创建散点图
散点图是通过两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式.散点图将序列显示为一组点,值由点在图表中的位置表示,类别由图表中的不同标记表示,通常用于比较 ...
- ArcGIS JS API加载带参数的rest服务参数被截掉问题处理
我们在做一些项目的时候,会对ArcGIS的图层服务进行转发,增加一些权限参数以保证数据访问的安全, 但使用ArcGIS JS API加载的时候,对于rest服务?后增加的参数会被截掉. 为解决这个问题 ...
- 记某gov门户网站渗透测试(已修复)
前言: 免责声明:涉及到的所有技术仅用来学习交流,严禁用于非法用途,未经授权请勿非法渗透.否则产生的一切后果自行承担! 该渗透测试项目为已授权项目,本文已对敏感部分做了相关处理. 正文: SQL注入( ...
- [数据库]mysql/mysqldump命令帮助说明
1 mysql [root@test ~]# mysql --help mysql Ver 14.14 Distrib 5.7.24-27, for Linux (x86_64) using 6.0 ...
- 四月十八日java基础知识
1.由于每个对象的pi值都是相同的,所以没有必要让每个对象都保存有自己的pi值,因此将pi声明为静态变量,使之成为所有对象共用的存储空间,所有对象都公用pi这个变量也就是说共用的变量可以设定为静态变量 ...
- 基于RL(Q-Learning)的迷宫寻路算法
强化学习是一种机器学习方法,旨在通过智能体在与环境交互的过程中不断优化其行动策略来实现特定目标.与其他机器学习方法不同,强化学习涉及到智能体对环境的观测.选择行动并接收奖励或惩罚.因此,强化学习适用于 ...
- C# 一个List 分成多个List
/// <summary> /// 一个List拆分多个List /// </summary> /// <param name= ...
- Lambda表达式和链式编程
一.Lambda表达式 1. Lambda使用条件 Lambda表达式是 JDK8 的一个新特性,可以认为是对匿名内部类的一种简化,但不是所有的匿名内部类都可以简化为Lambda表达式. 只有函数式接 ...