cookie与session

概念

由服务器创建后返回给前端,下次前端访问时,会携带cookie,服务器就可以获取到对应的参数。

操作

服务端创建并返回cookie

Cookie cookie = new Cookie(key,value);//以键值对的方式存放内容
cookie.setMaxAge(60*60*24*365);//设置cookie被浏览器保存的时间
cookie.setPath("/");//有效访问路径范围
response.addCookie(cookie);//HttpServletResponse

cookie还可以设置域名访问路径范围,是否使用安全协议等。

addCookie后,前端就可以拿取,并且在浏览器f12的Application的Cookies可以看到对应的值。

服务端获取前端携带cookie

Cookie[] cookies = request.getCookies();//HttpServletRequest

携带

浏览器在访问时,如果符合同源策略,则会自动携带cookie到后台。

同源策略:
https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

如果浏览器禁用掉cookie,那么浏览器则不会携带cookie到后台。

对于前端内部代码的一些http请求,比如ajax库的请求,必须设置withCredential为true时才会携带cookie。

session

概念

session的实现一般需要借助cookie,当前端访问后台时,后台生成session id,通过cookie返回给前端,前端下次访问时,会携带cookie,后台就通过cookie中携带的session id找到对应的session。

操作

获取session

HttpSession s = request.getSession(true);//HttpServletRequest

//等同
HttpSession s = request.getSession();//HttpServletRequest

设置数据

session.setAttribute(String name,Object obj);

setAttribute并不像cookie的addCookie方法可以给到前端,因为session是存在服务端的,所以也不能在浏览器f12的Application的中看到,里面有一个Session Storage跟这个不是一回事,而是跟Local Storage相对应的,一个临时,一个永久,cookie和session都是参与服务器通信的,而localStorage和sessionStorage不参与服务器通信。

获取数据

object session.getAttribute(String name);

移除数据

session.removeAttribute(String name);

session存储位置

如果时tomcat正常关闭,session会被持久化在tomcat的\work\Catalina\localhost相关目录下。

cookie禁用

当浏览器将cookie禁用,基于cookie的session将不能正常工作,每次使用request.getSession() 都将创建一个新的session。

处理方法:
1.session id的URL重写:将session id每次都携带到访问http的url地址中(标准说法:Query_String),后台通过过滤器拿到session id。
2.header:除了携带到访问http的url地址中,还可以携带到http header中。

禁用了cookie,所以后台没办法通过返回cookie让浏览器存储cookie,所以可能处理方法就是通http接口返回session id,前端自行存储在浏览器的localstorage中。(类似token的机制)
详情问题见:
https://segmentfault.com/q/1010000042085154?_ea=251103563

缺点

若服务器做了负载均衡,用户的下一次请求可能会被定向到其它服务器节点,若那台节点上没有用户的Session信息,就会导致会话验证失败。所以Session默认机制下是不适合分布式部署的。
所以才有token的出现。

参考

https://segmentfault.com/a/1190000041886918
https://www.cnblogs.com/dylan402/p/10395826.html
https://www.cnblogs.com/whgk/p/6422391.html

token与jwt

jwt是什么?

https://www.zhihu.com/question/274566992/answer/2486699791

token和jwt区别

总结

token被服务器返回前端后,服务器需要存储token并管理token的过期时间,前端携带token访问后台接口时需要跟服务器存储的token信息进行验证判断。

jwt被服务器返回前端后,由于过期时间等信息都携带到返回前的数据token中,前端携带token访问后台接口时,后台只需要解密并验证token的过期时间即可。

参考

https://blog.csdn.net/weixin_45203607/article/details/123736975

JWT实现单点登录

https://blog.csdn.net/weixin_47188125/article/details/126553799
https://blog.csdn.net/u011269242/article/details/122173839

jwt与token+redis,哪种方案更好用?

https://www.zhihu.com/question/274566992/answer/2486699791