Cookie 的实现原理是基于 HTTP 协议的,其中涉及到 HTTP 协议中请求头和响应头信息:
响应头:set-cookie
请求头: cookie
默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则 Cookie 被销毁,即会话级 Cookie
// 单位:秒
setMaxAge(int seconds)
复制代码
默认 Cookie 不能存储中文,直接传入中文会报 500 的错误
在 AServlet 中对中文进行 URL 编码,采用URLEncoder.encode(),将编码后的值存入 Cookie 中
在 BServlet 中获取 Cookie 中的值,获取的值为 URL 编码后的值
将获取的值在进行 URL 解码,采用URLDecoder.decode(),就可以获取到对应的中文值
@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);
}
}
复制代码
@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 虽然可以解决服务器跟踪用户状态的问题,但是它具有以下缺点:
| 留言与评论(共有 0 条评论) “” |