一.状态保持
状态保持的两种方法:
- 在客户端存储信息使用Cookie
- 在服务器端存储信息使用Session
① Cookie
Cookie是数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookieSession:将数据存储到服务器端,安全性相对好,增加服务器的压力
② Cookie的特点
- Cookie以键值对的格式进行信息的存储
- 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
- cookie默认的生命周期是一个会话,就是说只要浏览器关系,他就没有了,如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,设置多久时间,他就会存在多长时间
③ 设置Cookie
- 设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息
cookie.setMaxAge(10*60);
- 设置Cookie的携带路径:
如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息,比如/aa/servlet的这个路径的servlet产生了cookie,那么只有在访问WWW/aa下的资源的时候才会带cookie,如果访问WWW/a.jsp则不会带cookie,因为他不是aa目录下的
cookie.setPath("/WEB16")#代表访问WEB16应用中的任何资源都携带
cookiecookie.setPath("/WEB16/cookieServlet")#代表访问WEB16中的
cookieServlet时才携带cookie信息cookie.setPath("/")#访问服务器下的有应用都携带这个cookie
- 向客户端发送cookie:
#创建完成之后,只有发送才能到答响应体
response.addCookie(Cookie cookie)
- 删除客户端的cookie:
想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可,new相同name值的cookie,值无所谓(new相同的name的cookie会把前面相同name的覆盖)设置相同的setpath,最好设置最大Age为0,才删除,必须全部一样然后response.Add(这个cookie)向响应头增加一个set-cookie字段
④ Session
- session在html里面可以理解为一次会话,就是浏览器与服务器保持的一次连接,如果关闭浏览器,就会重新创建session。session这个特点可以用来保存一些基本信息。
⑤ session的相关配置
[Session]
session.save_handler = files
session.save_path = "d:/wamp/tmp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
⑥ 用redis存储session
- 更快的读取和写入速度。redis是直接操纵内存数据的,肯定是要比文件的形式快很多。
- 更好的设置好过期时间。文件存储的sess_sdewfrsf文件其实被删除掉还是要考运气的和概率的,很有可能造成sess_文件没即时删除,造成存储磁* 盘空间过多,和读取SESSION就变慢了。
- 更好的分布式同步。设置redis 的主从同步,可以快速的同步session到各台web服务器,比文件存储更加快速。
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6381"
⑦ cookie存在的目的
因为http协议属于无状态协议,它不跟踪从一个客户端到另一个客户端的请求信息.也就是说即使第一次和服务器连接后并且登录成功,第二次请求服务器依然不知道请求的是哪个用户.
所以使用cookie来解决这个问题:第一次登录成功后,服务器返回cookie给浏览器,然后浏览器保存在本地,当用户发送第二次请求时,就会自动的把上次请求存储的cookie数据携带给服务器,服务器再根据cookie数据判断是哪个用户.
⑧ session和cookie的作用类似
也是用来存储用户相关的信息,存储在服务器端.把用户的信息经过加密后存储在session中,然后产生一个唯一的session_id.
⑨ cookie和session的结合使用
一般有两种存储方式:
(1) 存储在服务器端:通过cookie存储一个session_id,然后具体的数据则是保存在session中.如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再请求时,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据,就知道用户到底是谁了.以及之前保存的一些状态信息,这种专业术语叫做server side session.
(2) 存储在客户端:将session数据加密,然后存储在cookie中.这种专业术语叫做 client side session.flask框架采用的就是这种方式,但是可以替换成其他形式.
⑩ 扩展
- 既然session依赖cookie,要是浏览器禁用了cookie改怎么达到状态保持的效果呢?
答:这个时候,就需要用到URL重写了,既让服务器收到的每个请求参数中都带有sessioinId,也就是从原本的隐式(headers传参)变为url或body传参。
- 当我们清空浏览器的时候,session会消失吗?
答:session是存在于服务器的,你清除浏览器缓存,只是清除了cookie,跟session一点关系都没有。那么为什么我们却不能访问网站,而需要重新登录了呢?因为清空了浏览器缓存,这时候cookie数组中必定不会有JSESSIONID这个cookie,所以必须得新建一个session,用新的sessionId来给JSESSIONID这个cookie赋值。由于是新建的session,session中必定没有userId这样的属性值,所以判断结果自然为空,所以需要重新登录。这次赋值以后,下一次再请求该网站的时候,由于cookie数组中已经有了JSESSIONID这个cookie,并且能通过该JSESSIONID的值找到相应的session,所以就不需要再重新登录了。