session 、cookie、token的区别

本文介绍了HTTP协议中的状态保持机制,包括Cookies和Sessions的工作原理及编程实现。探讨了它们的特点、创建方式、有效时间设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP协议与状态保持:Http是一个无状态协议


1. 实现状态保持的方案:


1)修改Http协议,使得它支持状态保持(难做到)
2)Cookies:通过客户端来保持状态信息
Cookie是服务器发给客户端的特殊信息
cookie是以文本的方式保存在客户端,每次请求时都带上它
3)Session:通过服务器端来保持状态信息
Session是服务器和客户端之间的一系列的交互动作
服务器为每个客户端开辟内存空间,从而保持状态信息
由于需要客户端也要持有一个标识(id),因此,也要求服务器端和客户端传输该标识,
标识(id)可以借助Cookie机制或者其他的途径来保存
2. COOKIE机制


1)Cookie的基本特点
Cookie保存在客户端
只能保存字符串对象,不能保存对象类型
需要客户端浏览器的支持:客户端可以不支持,浏览器用户可能会禁用Cookie
2)采用Cookie需要解决的问题

  • Cookie的创建
    通常是在服务器端创建的(当然也可以通过javascript来创建)
    服务器通过在http的响应头加上特殊的指示,那么浏览器在读取这个指示后就会生成相应的cookie了
  • Cookie存放的内容
业务信息("key","value")
过期时间
域和路径
浏览器是如何通过Cookie和服务器通信?
通过请求与响应,cookie在服务器和客户端之间传递
每次请求和响应都把cookie信息加载到响应头中;依靠cookie的key传递。


3. COOKIE编程


1)Cookie类
Servlet API封装了一个类:javax.servlet.http.Cookie,封装了对Cookie的操作,包括:
public Cookie(String name, String value) //构造方法,用来创建一个Cookie
HttpServletRequest.getCookies() //从Http请求中可以获取Cookies
HttpServletResponse.addCookie(Cookie) //往Http响应添加Cookie
public int getMaxAge() //获取Cookie的过期时间值
public void setMaxAge(int expiry) //设置Cookie的过期时间值


2)Cookie的创建
Cookie是一个名值对(key=value),而且不管是key还是value都是字符串
如: Cookie visit = new Cookie("visit", "1");


3)Cookie的类型——过期时间

会话Cookie
Cookie.setMaxAge(-1);//负整数
保存在浏览器的内存中,也就是说关闭了浏览器,cookie就会丢失

普通cookie
Cookie.setMaxAge(60);//正整数,单位是秒
表示浏览器在1分钟内不继续访问服务器,Cookie就会被过时失效并销毁(通常保存在文件中)


注意:
cookie.setMaxAge(0);//等价于不支持Cookie;

4. SESSION机制

session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。
这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:
如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

每次客户端发送请求,服务断都检查是否含有sessionId。
如果有,则根据sessionId检索出session并处理;如果没有,则创建一个session,并绑定一个不重复的sessionId。

1)基本特点
状态信息保存在服务器端。这意味着安全性更高
通过类似与Hashtable的数据结构来保存
能支持任何类型的对象(session中可含有多个对象)

2)保存会话id的技术

  • Cookie
    • 这是默认的方式,在客户端与服务器端传递JSeesionId
      缺点:客户端可能禁用Cookie
      表单隐藏字段
      在被传递回客户端之前,在 form 里面加入一个hidden域,设置JSeesionId:
      <input type=hidden name=jsessionid value="3948E432F90932A549D34532EE2394" />

    • URL重写
直接在URL后附加上session id的信息
HttpServletResponse对象中,提供了如下的方法:
encodeURL(url); //url为相对路径

5. SESSION编程

1)HttpSession接口

Servlet API定义了接口:javax.servlet.http.HttpSession, Servlet容器必须实现它,用以跟踪状态。
当浏览器与Servlet容器建立一个http会话时,容器就会通过此接口自动产生一个HttpSession对象

2)获取Session

HttpServletRequest对象获取session,返回HttpSession:
request.getSession(); //表示如果session对象不存在,就创建一个新的会话
request.getSession(true); //等价于上面这句;如果session对象不存在,就创建一个新的会话
request.getSession(false); //表示如果session对象不存在就返回 null,不会创建新的会话对象


3)Session存取信息

session.setAttribute(String name,Object o) //往session中保存信息
Object session.getAttribute(String name) //从session对象中根据名字获取信息

4)设置Session的有效时间

public void setMaxInactiveInterval(int interval)
设置最大非活动时间间隔,单位秒;
如果参数interval是负值,表示永不过时。零则是不支持session。

通过配置web.xml来设置会话超时,单位是分钟
<seesion-config>
<session-timeout>1</session-timeout>
</session-config>
  • 允许两种方式并存,但前者优先级更高

5)其他常用的API

6. Cookie和Session跟踪机制的比较
Cookie      Session
保持在客户端 保存在服务器端
只能保持字符串对象 支持各种类型对象
通过过期时间值区分Cookie的类型 需要sessionid来维护与客户端的通信
会话Cookie——负数 Cookie(默认)
普通Cookie——正数 表单隐藏字段
不支持Cookie——0 url重写
应用领域:web交易需要保存状态的时候,都可以使用,比如在分布式场景下可以利用分布式session技术等。

7.token
token的意思是“令牌”,是用户身份的验证方式,
最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、
sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。
还可以把不变的参数也放进token,避免多次查库.

8.token 和session 的区别

          1. Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 
          2. Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。这里的 Token是唯一的。不可以转移到其它 App上,也不可以转到其它 用户 上。 
          3. 转过来说Session Session只提供一种简单的认证,即有此 SID,即认为有此 User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App
          4.  所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

  • token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;
  • cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;
  • sessioncookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.
  • Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端



参考来源: https://www.zhihu.com/question/31079651/answer/136106134
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值