作者:我只当你的千纸鹤 | 来源:互联网 | 2023-08-06 19:52
cookiesessiontoken总结发展史一、cookie1.cookie简介2.cookie特点2.1由浏览器来管理2.2不可跨域名2.3中文需要编码2.4可保存二进制图片2
COOKIE session token总结 发展史 一、COOKIE 1.COOKIE简介 2.COOKIE特点 2.1 由浏览器来管理 2.2 不可跨域名 2.3 中文需要编码 2.4 可保存二进制图片 2.5 读取COOKIE 3. COOKIE常用属性 3.1 maxAge 有效期 3.2 secure 安全属性 二、session 1.session简介 2.session生命周期 3.常用属性 3.1 maxInactiveInterval 超时时间 4.需要浏览器客户端的支持 4.1 COOKIE中存储JSESSIONID 4.2 默认maxAge属性一般为–1 5. 浏览器不支持时,URL地址重写 5.1 实现 5.2 注意 5.3 Session中禁止使用COOKIE 方式一:修改web项目中的配置 方式二: 修改tomcat中的配置 三、token 四、COOKIE session token问题及解决方案 4.1 COOKIE 4.2 session 4.3 token 参考链接
发展史 一、COOKIE 1.COOKIE简介 COOKIE是存在客户端的一小段信息,用来记录用户状态。
客户端请求服务器, 服务器响应,需要记录该用户状态,就使用response发送一个响应到客户端,这个响应头,其中就包含Set-COOKIE头部。如下 浏览器保存COOKIE,发起的第二次请求时,浏览器会自动在请求头中添加COOKIE 服务器检查该COOKIE,以此来辨认用户状态 响应头:
Set-COOKIE: value[; expires=date][; domain=domain][; path=path][; secure]
2.COOKIE特点 2.1 由浏览器来管理 如果浏览器不支持COOKIE(如大部分手机中的浏览器)或者把COOKIE禁用了,COOKIE功能就会失效。
不同的浏览器采用不同的方式保存COOKIE。
IE浏览器会在“C:\Documents and Settings\你的用户名\COOKIEs”文件夹下以文本文件形式保存,一个文本文件保存一个COOKIE。
2.2 不可跨域名 根据COOKIE规范,浏览器能够保证Google只会操作Google的COOKIE而不会操作Baidu的COOKIE,从而保证用户的隐私安全
2.3 中文需要编码 中文属于Unicode字符,英文属于ASCII字符 COOKIE中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且Javascript也不支持GBK编码
2.4 可保存二进制图片 需要使用BASE64编码
并不实用。由于浏览器每次请求服务器都会携带COOKIE,因此COOKIE内容不宜过多,否则影响速度。COOKIE的内容应该少而精。
2.5 读取COOKIE 浏览器提交COOKIE时只会提交name与value属性。其他属性如maxAge属性只被浏览器用来判断COOKIE是否过期
3. COOKIE常用属性 Java中把COOKIE封装成了javax.servlet.http.COOKIE类。每个COOKIE都是该COOKIE类的对象。服务器通过操作COOKIE类对象对客户端COOKIE进行操作。
通过request.getCOOKIE()获取客户端提交的所有COOKIE(以COOKIE[]数组形式返回),通过response.addCOOKIE(COOKIECOOKIE)向客户端设置COOKIE
3.1 maxAge 有效期 -1(默认值):
临时性COOKIE,不会被持久化,不会被写到COOKIE文件中 仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该COOKIE即失效 0: 删除该COOKIE COOKIE机制没有提供删除COOKIE的方法,因此通过设置该COOKIE即时失效实现删除COOKIE的效果
正数:
COOKIE会在maxAge秒之后自动失效 浏览器会持久化,即写到对应的COOKIE文件中 3.2 secure 安全属性 secure属性并不能对COOKIE内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对COOKIE内容加密、解密,以防泄密。
二、session 1.session简介 Session是服务器端使用的一种记录客户端状态的机制
2.session生命周期 2.1 在用户第一次访问服务器的时候自动创建,一般把Session放在内存里 2.2 只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session 2.3 服务器会把长时间内没有活跃的Session从内存删除
3.常用属性 Session对应的类为javax.servlet.http.HttpSession类
3.1 maxInactiveInterval 超时时间 setMaxInactiveInterval(int seconds)修改超时时间 Tomcat中Session的默认超时时间为20分钟 修改web.xml改变Session的默认超时时间。例如修改为60分钟: 60
4.需要浏览器客户端的支持 4.1 COOKIE中存储JSESSIONID HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的COOKIE,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该COOKIE来识别是否为同一用户。
4.2 默认maxAge属性一般为–1 该COOKIE为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效
5. 浏览器不支持时,URL地址重写 URL地址重写是对客户端不支持COOKIE的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。
5.1 实现 HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,该方法会自动判断客户端是否支持COOKIE。如果客户端支持COOKIE,会将URL原封不动地输出来。如果客户端不支持COOKIE,则会将用户Session的id重写到URL中如:
response.encodeURL("index.jsp?c=1&wd=Java") 如果是重定向的 response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));
重新后
对于WAP程序,
TOMCAT判断客户端浏览器是否支持COOKIE的依据是请求中是否含有COOKIE。尽管客户端可能会支持COOKIE,但是由于第一次请求时不会携带任何COOKIE(因为并无任何COOKIE可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入COOKIE了,因此URL地址重写后的地址中就不会带有jsessionid了。
5.3 Session中禁止使用COOKIE 既然WAP上大部分的客户浏览器都不支持COOKIE,索性禁止Session使用COOKIE,统一使用URL地址重写会更好一些。Java Web规范支持通过配置的方式禁用COOKIE
方式一:修改web项目中的配置 META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建) 打开context.xml(如果没有则创建),编辑内容如下:
方式二: 修改tomcat中的配置 conf/context.xml
注意:该配置只是禁止Session使用COOKIE作为识别标志,并不能阻止其他的COOKIE读写。也就是说服务器不会自动维护名为JSESSIONID的COOKIE了,但是程序中仍然可以读写其他的COOKIE。
三、token 3.1 token简介 token 也称作令牌,由uid+time+sign[+固定参数]
uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库 四、COOKIE session token问题及解决方案 4.1 COOKIE 浏览器对单个COOKIE保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个COOKIE 有的客户端不支持COOKIE,需要手动设置,比如小程序 浏览器对COOKIE有限制,不能手动设置COOKIE,对于混合嵌套的开发有问题,比如小程序跳转H5页面,不能携带COOKIE CSRF(跨站请求伪造)攻击,这个也好解决,很多框架都屏蔽这个问题 4.2 session 过多的session存在服务器中,对服务器造成压力 不能完全达到负载均衡效果 负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享seesion。这个问题也可以将session存在一个服务器中来解决,但是就不能完全达到负载均衡的效果。
4.3 token 可以放在header、url中,在每次网络访问都携带,一般是写请求头header中。
token相比于COOKIE就是有COOKIE的功能,没有COOKIE的限制。比如其他客户端不会限制header的COOKIE。token是COOKIE很好替代品。
参考链接 https://blog.csdn.net/fangaoxin/article/details/6952954