Continuez à créer, accélérez la croissance ! C'est le troisième jour de ma participation au "Nuggets Daily New Plan · June Update Challenge", cliquez pour voir les détails de l'événement
1. Analyse du principe des cookies
Le principe de mise en œuvre des cookies est basé sur le protocole HTTP , qui fait intervenir les informations d'en-tête de requête et d'en-tête de réponse dans le protocole HTTP :
- En-têtes de réponse :
set-cookie
- En-tête de requête :
cookie
- Lorsque le navigateur client accède au serveur, le serveur envoie les informations de données au navigateur en ajoutant Set-Cookie dans la réponse HTTP.
响应头字段
- Une fois que le navigateur a obtenu le résultat de la réponse, il peut obtenir la
Set-Cookie
valeur correspondante à partir de l'en-tête de réponse et enregistrer le cookie dans la mémoire du navigateur ou sur le disque dur. - Lorsque le serveur est à nouveau sollicité, le navigateur renvoie le cookie au serveur Web en ajoutant un cookie au message de requête HTTP.
请求头字段
- Le serveur suit l'état du client en fonction des informations sur le cookie, et l'objet Request encapsule la valeur correspondant au cookie dans l'en-tête de la demande dans un objet cookie, et forme enfin un tableau de cookies.
- Envoyer un cookie au navigateur
- Obtenir les cookies du cache du navigateur
2. Détails d'utilisation des cookies
1️⃣Durée de vie des cookies
Par défaut, les cookies sont stockés dans la mémoire du navigateur. Lorsque le navigateur est fermé et que la mémoire est libérée, les cookies sont détruits, c'est -à-dire les cookies de niveau session.
Définir la durée de stockage des cookies
- Définissez le temps de survie du cookie, c'est-à-dire le cookie persistant , à ce moment, le cookie est stocké
电脑磁盘
sur le
// 单位:秒
setMaxAge(int seconds)
复制代码
- Détails de paramétrage des secondes
-
正数
:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除 -
负数
:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁 -
零
:使用 setMaxAge(0) 手动删除 Cookie时,需要使用 setPath 方法指定 Cookie 的路径,且该路径必须与创建 Cookie 时的路径保持一致
2️⃣Cookie存储中文
默认Cookie不能存储中文,直接传入中文会报500的错误
解决方案
在AServlet中对中文进行URL编码,采用
URLEncoder.encode()
,将编码后的值存入Cookie中在BServlet中获取Cookie中的值,获取的值为URL编码后的值
将获取的值在进行URL解码,采用
URLDecoder.decode()
,就可以获取到对应的中文值
示例
- 在Servlet1中对中文进行URL编码
@WebServlet("/c1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.对中文进行UTF-8编码
String username = "倔强的牛角";
String encodeUserName = URLEncoder.encode(username, StandardCharsets.UTF_8);
// 2.创建cookie对象,存入编码后的中文
Cookie c1 = new Cookie("username", encodeUserName);
Cookie c2 = new Cookie("password", "123456");
// 3.设置存活时间,1周 7天
c1.setMaxAge(60*60*24*7);
c2.setMaxAge(60*60*24*7);
// 4.向浏览器发送cookie
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
- 在Servlet2中获取值,并对值进行解码
@WebServlet(name = "CookieDemo", value = "/c2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取cookie数组
Cookie[] cookies = request.getCookies();
// 2.遍历数组
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
if ("username".equals(cookieName)) {
// 对中文进行UTF-8解码
String decodeUserName = URLDecoder.decode(cookieValue, StandardCharsets.UTF_8);
System.out.println("key:" + cookieName + ",value:" + decodeUserName);
continue;
}
System.out.println("key:" + cookieName + ",value:" + cookieValue);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
复制代码
- 演示结果
- 存储到浏览器的是编码后的中文
- 获取编码的中文,并解码
三、Cookie的缺点
Cookie 虽然可以解决服务器跟踪用户状态的问题,但是它具有以下缺点:
- 在 HTTP 请求中,Cookie 是明文传递的,容易泄露用户信息,安全性不高。
- 浏览器可以禁用 Cookie,一旦被禁用,Cookie 将无法正常工作。
- Cookie 对象中只能设置文本信息(字符串)信息。
- 客户端浏览器保存 Cookie 的数量和长度是有限制的。