Cookie 的实现原理是基于 HTTP 协议的,其中涉及到 HTTP 协议中请求头和响应头信息:
响应头:
set-cookie
请求头:
cookie
客户端浏览器访问服务器时,服务器通过在 HTTP 响应中增加 Set-Cookie 响应头字段
,将数据信息发送给浏览器。
浏览器获取到响应结果后,从响应头中就可以获取到Set-Cookie
对应值,并将 Cookie 保存在浏览器内存中或硬盘上。
再次请求该服务器时,浏览器通过在 HTTP 请求消息中增加 Cookie 请求头字段
,将 Cookie 回传给 Web 服务器。
服务器根据 Cookie 信息跟踪客户端的状态,Request 对象会把请求头中 cookie 对应的值封装成一个个 Cookie 对象,最终形成一个 cookie 数组
向浏览器发送 cookie
从浏览器缓存中获取 cookie
默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则 Cookie 被销毁,即会话级 Cookie
设置 Cookie 存储时间
设置 Cookie 存活时间,即持久级 Cookie, 此时 Cookie 存到了电脑磁盘
上
// 单位:秒
setMaxAge(int seconds)
复制代码
seconds 的参数设置详情
正数
:将 Cookie 写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
负数
:默认值,Cookie 在当前浏览器内存中,当浏览器关闭,则 Cookie 被销毁
零
:使用 setMaxAge(0) 手动删除 Cookie 时,需要使用 setPath 方法指定 Cookie 的路径,且该路径必须与创建 Cookie 时的路径保持一致
默认 Cookie 不能存储中文,直接传入中文会报 500 的错误
解决方案
在 AServlet 中对中文进行 URL 编码,采用
,将编码后的值存入 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 = de(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 = Cookies();
// 2.遍历数组
for (Cookie cookie : cookies) {
String cookieName = Name();
String cookieValue = Value();
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 虽然可以解决服务器跟踪用户状态的问题,但是它具有以下缺点:
在 HTTP 请求中,Cookie 是明文传递的,容易泄露用户信息,安全性不高。
浏览器可以禁用 Cookie,一旦被禁用,Cookie 将无法正常工作。
Cookie 对象中只能设置文本信息(字符串)信息。
客户端浏览器保存 Cookie 的数量和长度是有限制的。
本文发布于:2024-02-04 18:32:08,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170713736258377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |