一.cookie
1.什么是cookie?
Cookie用于存储web页面的用户信息。
Cookie是一些数据,存储于你电脑的文本文件中。
当web服务器向浏览器发送web页面时,在连接关闭后,服务端不会记录用户的信息。
而Cookie的作用就是用于解决“如何记录客户端的用户信息”:
当用户访问web页面时,他的名字可以记录在cookie中。
在用户下一次访问该页面时,可以在cookie中读取用户访问记录。
当浏览器从服务器上请求web页面时,属于该页面的cookie会被添加到该请求中。服务端通过这种方式来获取用户的信息。
2.cookie属性
属性名称 | 属性含义 |
name | cookie 的名称 |
value | cookie 的值 |
comment | cookie 的描述信息 |
domain | 可以访问该 cookie 的域名 |
expires | cookie 的过期时间,具体某一时间 |
maxAge | cookie 的过期时间,比如多少秒后 cookie 过期 |
path | cookie 的使用路径 |
secure | cookie 是否使用安全协议传输,比如 SSL 等 |
version | cookie 使用的版本号 |
isHttpOnly | 指定该 Cookie 无法通过 JavaScript 脚本拿到,比如 Document.cookie 属性、XMLHttpRequest 对象和 Request API 都拿不到该属性。这样就防止了该 Cookie 被脚本读到,只有浏览器发出 HTTP 请求时,才会带上该 Cookie。 |
3.cookie举例
上图可分为以下几步:
1.客户端发送请求到服务端(比如登录请求)。
2.服务端收到请求后生成一个 session 会话。
3.服务端响应客户端,并在响应头中设置 Set-Cookie。Set-Cookie 里面包含了 sessionId,它的格式如下:Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]。其中 sessionId 就是用来标识客户端的,类似于去饭店里面,服务员给你一个号牌,后续上菜通过这个号牌来判断上菜到哪里。
4.客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。
5.客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。
6.服务端接收到请求,验证 cookie 信息,比如通过 sessionId 来判断是否存在会话,存在则正常响应。
二.session
1.什么是session
session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给客户端,通常是存储在 cookie 中。如果在请求中找到了真正的 session,验证通过,正常处理该请求。
总之每一个客户端与服务端连接,服务端都会为该客户端创建一个 session,并将 session 的唯一标识 sessionId 通过设置 Set-Cookie 头的方式响应给客户端,客户端将 sessionId 存到 cookie 中。
通常情况下,我们 cookie 和 session 都是结合着来用,当然你也可以单独只使用 cookie 或者单独只使用 session
下面为session简单示意图:
2.常用API(应用程序接口)
名称 | 作用 |
getId() | 得到sessionId |
invalidate() | 让session立刻失效 |
getAttribute(String key) | 根据key获取该session中的value |
setAttribute(String key,Object value) | 往session中存放key-value |
removeAttribute(Stringkey) | 根据key删除session中的key-value |
getServletContext() | 得到ServletContext |
setMaxInactiveInterval(long timeout)/getMaxInactiveInterval | 设置/获取session的最大有效时间 |
getCreationTime | 获取session的创建的时间 |
getLastAccessedTime | 获取session最后一次访问的时间 |
getSession() | 从HttpServletRequest中获取session |
3.session与cookie的区别
1).保存的位置不同
cookie保存在浏览器端,session保存在服务端。
2).使用方式不同
cookie如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
3).存储内容不同:cookie只能存储字符串,而session存储结构类似于hashtable的结构,可以存放任何类型。
4).存储大小:``cookie最多可以存放4k大小的内容,session则没有限制。
5).session的安全性要高于cooKie
6).cookie的session的应用场景:cookie可以用来保存用户的登陆信息,如果删除cookie则下一次用户仍需要重新登录
session就类似于我们拿到钥匙去开锁,拿到的就是我们个人的信息,一般我们可以在session中存放个人的信息或者购物车的信息。
7).session和cookie的弊端:cookie的大小受限制,cookie不安全,如果用户禁用cookie则无法使用cookie。如果过多的依赖session,当很多用户同时登陆的时候,此时服务器压力过大。sessionId存放在cookie中,此时如果对于一些浏览器不支持cookie,此时还需要改写代码,将sessionID放到url中,也是不安全。
三.token
1.什么是token?
token是“令牌”的意思。它不像cookie和session一样是一种web规范,而是服务端生成的一串字符串,以作客户端进行请求的一个标识。当第一次登录后,服务器生成一个token便将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
2.token有什么用?
token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。说白了token是一个身份卡,有权限的作用。
使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。
大概的流程:
1).客户端使用用户名和密码请求登录。
2).服务端收到请求,验证用户名和密码。
3).验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
4).客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
5).客户端每次向服务端发送请求的时候都需要带上服务端发给的token。
6).服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。
token还有防止爆破的作用,比如我之前打过的pikachu(皮卡丘)靶场的第一大关,详见我之前写过的pikachu靶场通关系列博客。