Session和Cookie
Session
HTTP是一个无状态的协议(是指协议对于事务处理没有记忆能力,服务器不知道客户端处于什么状态。及我们给服务器发送http请求,服务端根据请求会给我们发送数据过来。但是发送完成后不会记录任何信息),短连接。
一旦客户端和服务器的数据交换完毕,就会断开连接,再次请求,会重新连接,这就说明服务器单从网络连接上是没有办法知道用户身份的。怎么办呢?这时就与要引入Session(会话)。
那就给每次新的用户请求时,给它颁发一个身份证(独一无二)吧,下次访问,必须带上身份证,这样服务器就会知道是谁来访问了,针对不同用户,做出不同的响应。,这就是Cookie的原理
登录操作:
(1)生成一个随机的字符串Session_id,保存在Tomcat的用户信息数据结构中,一个Session_id绑定一个用户,一个用户保存多个信息
(2)把Session_id放在响应头,头信息的键值对,键是双方约定好的,值就是Session_id值
(3)客户端之后的请求都携带Session_id
(4)服务端接收请求,都验证Session_id(在map中通过通行证证号,查找用户,来判断是否登陆)
总结
(1)Session是干嘛的?
会话,用来保持用户身份信息
主要解决需要登录的敏感资源的访问信息
(2)如何实现的?
通过服务器来保存Session信息
(3)流程?
session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存上面)当客户端向服务器发出请求时,要求服务器产生一个session时,服务器会检查一下客户端的cookie里面有没有sessionid以及它是否过期,如果有sessionid,服务器会根据cookie里的sessionid把服务器的session检索出来,如果没有这样的sessionid的话,服务器会重新建立一个(随机生成),同一客户端启动二次session的话,sessionid是不一样的
如何创建一个Session
//获取Session信息(从客户端获取jsessionid,在服务端map找到session对象),
// 参数为false,如果获取不到,返回null
//参数为true,如果获取不到,创建一个(服务端创建,再返回)
HttpSession session = req.getSession(false);
if(session==null){
resp.setStatus(401);//没有登陆访问敏感资源
}
Cookie
背景
使用场景:免登录,个性化设置
实现
将用户信息保存在客户端本地(和浏览器相关的本地路径下,保存用户信息到本地文件),跟域名进行绑定用户信息的Cookie,之后访问某个域名时,浏览器自动从本地抓取该域名的cookie信息
Session和Cookie的区别
(1)保存位置不同:Cookie是保存在客户端,Session是保存在服务端。
(2)安全性:因为Cookie是保存在客户端的,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;而Session是保存在服务端的,相比较于Cookie更安全
(3)是否与要浏览器支持:Cookie是需要浏览器支持的,如果在设置关闭Cookie支持,则不能使用Cookie
(4)有效时间不一样:通常情况下Cookie可以长时间保存,而Session只可以进行一段时间保存(一般30分钟)