目录
一、HTTP无状态。
(1)"记住我"?
(2)HTTP无状态。
(3)信息存储客户端中。如何处理?
1、loaclStorage与sessionStorage。
2、Cookie。
二、Cookie。
(1)Cookie是什么?
(2)Cookie的特征。
1、Cookie组成。
2、Cookie的主要特性。
(3)Cookie的API。
1、创建Cookie。
2、发送Cookie。
3、获取Cookie值。
(4)Cookie的覆盖。
1、案例演示。
2、Cookie路径(path)。
3、Cookie覆盖。
(5)Cookie的生命周期。
1、什么是Cookie的生命?
2、Cookie死亡。
3、Cookie最大存活时间。
一、HTTP无状态。
(1)"记住我"?
- 通常,处于登录界面时,我们输入用户名与密码点击"提交"前,会有一个“记住我”功能!当用户名、密码验证成功,浏览器该如何存储对应的信息(用户名、密码等等)呢?
- 是保存在服务器?还是保存在客户端中?
(2)HTTP无状态。
- HTTP协议是无状态的,这意味着服务器不会保存任何关于客户端请求之间的信息。
- 每次HTTP请求都是独立的,服务器不会记住之前发生过的请求。
- 也就是:每个请求都是独立的,服务器处理完请求后就会结束会话,不会保留任何会话信息。
- 为了解决无状态协议带来的问题,引入了Cookies和Session等技术来维持用户会话。Cookies是客户端的存储机制,用于保存状态信息;而Session则是服务器端的存储机制,用于跟踪用户状态。
- 如果将“用户信息”存在在服务器中。那么就需要"东西"让服务器分辨当前是哪个用户访问,再给对应的用户信息。
- 这样服务器的压力就会很大!所以应该是每个用户的"登录个人信息"存储在用户所安装的客户端浏览器中,而不是存储在服务器。
- 这样当用户A登录时,从用户A的客户端浏览器拿到对应的信息。当用户B登录时,就从用户B客户端浏览器拿到对应的信息。这样就有效的区分了每个客户端的信息。
(3)信息存储客户端中。如何处理?
- 基于客户端浏览器的访问。如何将数据保存在客户端浏览器中?
- 登录校验的逻辑代码是在服务器端运行的。只要登录成功后,就会将(用户名、密码)存储在到客户端浏览器中。
- 如下三个被红色框选中的(客户端浏览器中)都可以存储信息。
1、loaclStorage与sessionStorage。
- 其中本地存储空间(loaclStorage)、会话存储(sessionStorage)空间:都是纯正的js技术。
- 它们之间的区别:loaclStorage是所有用户都可以拿到信息。(数据在浏览器关闭后仍可保留)而sessionStorage是在一次会话中有效。(与服务器一次通信)
2、Cookie。
- 既可以使用js操作,也可以使用Java进行操作!因为服务器端代码(/..xxServlet)也是Java语言写的,这就刚好可以使用这个"Cookie"。
- 接下来就详细的介绍Cookie!
二、Cookie。
(1)Cookie是什么?
- "Cookie"翻译成中文:小甜点,小饼干的意思。
- 在HTTP中它表示服务器发送给客户端浏览器的小甜点。
- 其实Cookie就是一个键和一个值(key/value)构成的,随着服务器端的响应发送给客户端浏览器。
- 注意:Cookie的存储的key/value都是String类型。域对象中存储的value是object类型。
- 如下:Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。
- 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。
- 当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
(2)Cookie的特征。
1、Cookie组成。
- Cookie通常包含一个键(名称)、一个值,以及一些属性。(如有效期、路径、域和安全标志)
- 可以看到键"user"——>值"lisi"、键"password"——>值"123456"。
- 响应的服务器是本机:http://localhost:8080。
- 路径:"/"。表示所有的请求都可以拿到该Cookie。
2、Cookie的主要特性。
- Cookie的工作原理涉及到客户端(浏览器)和服务器之间的交互。
- Cookie创建于服务器,保存于客户端浏览器上。不同浏览器之间Cookie无法共享,无法跨浏览器。
- 客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
- Cookie本身是一种有用的技术,用于在客户端存储状态信息,但它也存在一些安全风险。在实际案例中,还需要对Cookie进行加密或者不存储敏感信息。(否则明文显示)
(3)Cookie的API。
- Cookie是一个类(class)。
1、创建Cookie。
- 通常都是使用:new 构造方法。
- 构造方法只有一个:new Cookie(键名,键值)。
- 案例演示。创建服务器:AServlet。创建两个Cookie(cookie1、cookie2)。并使用addCookie()方法发送到客户端对应的Cookie。如果不发送,客户端无法得到Cookie。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: AServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午4:52* @description: 测试类*/ @WebServlet("/AServlet") public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建CookieCookie cookie1 = new Cookie("k1","v1000");Cookie cookie2 = new Cookie("k2","v2000");//发送Cookieresp.addCookie(cookie1);resp.addCookie(cookie2);} }
- 此时cookie1的k1与v1000、cookie2的k2与v2000都已经存储在客户端中。
2、发送Cookie。
- 服务器中调用方法:addCookie(Cookie对象)。
- 验证:之后的请求,客户端浏览器会自动的携带Cookie通过请求头发送给服务器。
- 创建BServlet,里面只重写了doGet()方法。直接再次请求访问BServlet。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 测试*/ @WebServlet("/BServlet") public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }
- 显然是自动的将Cookie发送给服务器了。
3、获取Cookie值。
- 方法1。通过request.getHeader("Cookie")。不推荐!
- 方法2。request.getCookies()。这样可以拿到所有的Cookie。再通过循环遍历,拿取对应的键名的键值。先通过getName()拿到键名,再根据键名拿到值getValue()。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 测试*/ @WebServlet("/BServlet") public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取指定CookieCookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();if(name.equals("k1")){String value = cookie.getValue();System.out.println(name);System.out.println(value);break;}}/*String cookie = req.getHeader("Cookie");System.out.println(cookie);*/} }
- 成功拿到键名"k1"对应的键值"v1000"。
(4)Cookie的覆盖。
1、案例演示。
- 先访问/AServlet。再访问/user/AServlet。看看对应的Cookie。
- /AServlet。
- /user/AServlet。
2、Cookie路径(path)。
- 可以通过设置Cookie的path来指定浏览器,在访问什么样的路径时,包含什么样的Cookie。
- 如果Cookie的name(键名)与path(路径)一样,就会覆盖value(键值)。
- 如果没有设置path:默认值,创建Cookie的资源(服务器)的上级路径!
- 像访问资源(/user/BServlet)对应的path:"/user"。访问资源(/BServlet)对应的path:"/"。
- 举例访问某个路径下的资源,能访问的对应Cookie。
- 创建Cookie时,主动设置Cookie路径。方法:setPath()。
3、Cookie覆盖。
- 修改"/user/AServlet"。重新访问。
(5)Cookie的生命周期。
1、什么是Cookie的生命?
Cookie不只是有name(键名)和value(键值)。Cookie还有生命。
所谓Cookie生命就是Cookie在客户端的有效时间。可以通过setMaxAge(int)来设置Cookie的最大有效时间。
2、Cookie死亡。
像上面的BServlet,我把所有的客户端浏览器关闭(结束本次会话)。对应的Cookie(cookie1的k1与v1000、cookie2的k2与v2000)消失了。
因为它们都是会话级别。会话结束,对应的Cookie自动失效。
- k1、k2已消失。
3、Cookie最大存活时间。
默认存活时间:会话级别。只有客户端的浏览器关闭,这个Cookie就会被删除!
注意:如果是服务器关闭,只要客户端不关闭,Cookie不会被删除。
调用setMaxAge(int 参数) 设置最大存活时间。参数的单位:秒。
具体的实践大家自己尝试!