Cookie和Session和Cache

前言

一直对cookie和session分不清作用,特意看了几篇博客,想写一写总结

二者区别

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份

网上看了一个例子,觉得很好拿来引用,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话,得到结论是一个用户的所有请求操作都应该属于同一个会话,但是HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。所以需要引入一种机制,即Cookie

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过HttpServletRequest.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回,可迭代出每个Cookie),通过HttpServletResponse.addCookie(Cookie cookie)向客户端设置Cookie,另外Spring工具类WebUtils封装了一个方法getCookie参数为HttpServletRequest request, String name,根据request和name找到对应的Cookie,Springmvc中的@CookieValue可让处理方法入参绑定某个 Cookie 值,如@CookieValue(value = "count", defaultValue = "0") Long count是将Cookie绑定到参数count上,如果找不到Cookie则默认设置为0。

Cookie具有不可跨域名性,Google也只能操作Google的Cookie,而不能操作Baidu的Cookie,从而保证用户的隐私安全,其根据域名来判断权限

Cookie的常用属性

Cookie常用属性图

setMaxAge

  • 0 表示删除Cookie
  • -1 表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效
  • Integer.MAX_VALUE 表示整个生命周期有效

Cookie的修改、删除

如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

Session

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。

Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(String key)setAttribute(String key,Object value)方法读写客户状态信息。Servlet里通过request.getSession()ServletRequestAttributes.getSession(boolean create)方法获取该客户的Session,参数boolean类型的意思是,如果该客户的Session不存在,request.getSession()方法会返回null,而getSession(true)会先创建Session再将Session返回。

Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。Session在用户第一次访问服务器的时候自动创建Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session需要使用Cookie作为识别标志,HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户

Session的常用属性

Session常用属性图

可以修改web.xml改变Session的默认超时时间,也可以通过setMaxInactiveInterval(int seconds)修改超时时间

1
2
3
4
<session-config>
<!--单位分钟-->
<session-timeout>60</session-timeout>
</session-config>

Cache

cache ,是服务器端的缓存,是所有用户都可以访问和共享的,因为从Cache中读数据比较快,所以有些系统(网站)会把一些经常被使用的数据放到Cache里,提高访问速度,优化系统性能

赏个🍗吧
0%