Session和Cookie的应用
背景
我们知道http请求是一个无状态的协议并且是短连接的。也就是说每次请求响应,都会新建连接,响应完成之后就会关闭连接。
但是我们有些资源需要登录之后才可以访问,但是http登录这个请求完成之后就会关闭这个连接,所以我们为了判断是否进行过登录操作(是否可以访问到敏感资源),一般就会加入Cookie字段和Session字段来判断是否进行过登录操作。
Session
Session的应用
就是为了保持用户的身份,让服务器端和客户端可以保持正常的会话功能,主要就是为了解决登录的敏感资源的访问的问题
Session的实现
我们在服务器端登陆的时候创建一个用当前客户的sessionId,然后储存在服务器中。
Session实现的流程
- 根据当前登陆的用户的信息,然后生成随机字符串sessionid,保存在服务器端的用户信息数据结构中,每一个sessionid只能绑定一个用户,一个用户可以有多个信息
- 会把sessionid放在响应头,头信息的键值对,键是服务器端和客户端约定好的,然后值就是sessionid
- 客户端之后的所有请求都会携带sessionid,以便服务器端查询这个用户是否有访问这个资源的权限
// 从客户端获取jsessionid 然后从服务端Map中获取session对象
// 参数为false 获取不到,返回null
// 参数为true 获取不到,服务器创建一个 (无参为true)
// HttpSession session = req.getSession(false);
// 创建session
HttpSession session = req.getSession(true);
Session的注销
Session会在会话结束,会话超时,会话注销,以及服务器端关闭的时候被删除。
Cookie
Cookie的应用
使用场景就是免登录,我们有时在浏览器上进入某一个网站的时候,然后关闭浏览器,然后打开这个浏览器,进入同样的网站的时候,我们就会发现不需要再次登陆了。
Cookie的实现
Cookie会将用户信息保存在客户端本地。也就是说当我们进入这个网站登录之后,这个浏览器就会把这个用户信息保存在和自身相关的本地路径下,保存用户信息成为本地文件。不过这个Cookie信息一般是有时间的,若是你长时间没有登录这个网站,这个Cookie信息就会被删除。
当域名(网站)绑定用户的信息的Cookie,之后访问这个域名的时候,浏览器(客户端)就会自动从本地抓取该域名的Cookie信息
Cookie实现的流程
- 根据当前登陆的用户的信息,生成一个Cookie信息,保存在本文件中
- 登录成功后,就会有响应头Set-Cookie,之后每次的浏览器(客户端)的请求都会自动携带Cookie,然后服务器解析Cookie用来校验用户的信息。
Cookie的注销
我们找到Cookie的本地文件删除就可以了,或者就是过段时间,长时间未使用这个Cookie,那木Cookie就会被客户端自动删除。
Cookie和Session的区别
- 存取方式不同,Cookie只能保管ASCII字符串,获取别的类型的数据之时需要先进行编码,也不可以直接存储 Java对象。Session可以存取任何类型的数据。
- 隐私策略不同, Cookie存储在客户端的本地文件中,对客户端是可见的,不安全。而Session是存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
- 有效期不同,Cookie是可以长久的保存在本地文件中,通过设值Cookie的过期时间属性来保存Cookie的,常常用于免登录。但是Session不可以,Sesion中JSESSONID的过期时间默许为-1,一旦会话的结束和超时或者服务器端重启,这个Sesssion就会失效。
- 服务器的压力,Session储存在服务器端,而一旦服务器端的Session过多(并发访问服务器的人数过多),服务器的内存就容易溢出。Cookie保存在客户端,不占用服务器资源