session:
是一种记录客户状态的机制,他是保存在服务器上的。客户端浏览访问服务器的时候,服务器吧客户端的信息已某种形式记录在服务器上。
之前一直认为当关闭浏览器窗口的时候session就会销毁,其实这种说法是不正确的。当session开始时,servlet容器会创建一个HttpSession对象,在这个HttpSession对象中,可以保存用户的状态信息,servlet容器为HttpSession对象分配一个唯一标识即Sessionid,servlet容器会吧Sessionid作为一个cookie保存在客户端的浏览器中,用户每次发出http请求时,servlet容器会从HttpServletRequest中取出sessionid,然后根据这个sessionid找到相应的httpsession对象,从而获取用户的状态信息。
结束session方法:1.用session。invalidate()方法。不推荐使用。2.当用户和服务器的交互时间超过默认时间后,session失效。Tomcat中session的默认失效时间是30分钟。
浏览器得到session的方式是根据保存在客户端浏览器中的cookie来获取保存在服务器端的session,这就解释了为什么关闭浏览器就再也访问不到session了。
cookie:
cookie是一小段的文字信息,保存数据不超过4K,最多有20个cookie。客户端请求服务器,如果服务器需要记录该用户的状态,就是用response向客户端浏览器发送一个cookie。客户端浏览器会将cookie保存起来。当浏览器在此请求该网站时,浏览器就会把请求的网址与cookie一同交给服务器。服务器检查该cookie,一次来辨认用户状态。服务器端也可以修改cookie的内容。
cookie可以分为两种:会话cookie和持久cookie。会话cookie是一种临时cookie,用户退出浏览器,会话cookie就会被删除,上文提到的cookie就是会话cookie;持久cookie会存储在硬盘中,保留时间很长,就算重启电脑,也依然存在,我们浏览网页时留下的痕迹就是持久cookie,浏览器会根据这些痕迹推送相关的内容。
查看当前页面cookie的方法有两种,一种是在浏览器的地址栏输入javascript:alert(document.cookie),就会弹出你在当前页面的cookie信息;第二种是按F12进入浏览器的开发者模式,找到console,在命令行输入javascript:alert(document.cookie)按回车
token:
token是令牌,是用户身份的验证方式,组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。
token特点:无状态,可扩展,支持移动设备,跨程序调用(可用于单点登录),安全。
session与cookie区别:
1.session是有状态的,cookie是无状态的。
2.session吧数据放在服务器上,cookie把数据放在客户的浏览器上。
3.cookie不是很安全,别人可以分析存放在本地的cookie冰进行cookie欺骗,考虑到安全应当使用session。
4.session会一定时间内保存在服务器上。当访问增多时,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当用cookie。
5.一般,登录信息等重要信息存放在session中,其他信息如果需要保存放在cookie中。
附加内容:
有状态与无状态:
对于服务器来说,判断有无状态的依据为来自想吐发起者的请求在服务器上是否具有上下文关系。
有状态请求是指服务器端一般都要保存请求相关的信息,每个请求可以默认地使用以前的请求信息。
无状态指服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身锁保存的、并且可以被所有请求锁使用的公共信息。
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
session是有状态的,cookie与token是无状态的。