創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して3日目です。クリックしてイベントの詳細をご覧ください。
1.クッキーの原則の分析
Cookieの実装原則は、HTTPプロトコルに基づいています。これには、HTTPプロトコルの要求ヘッダーと応答ヘッダーの情報が含まれます。
- 応答ヘッダー:
set-cookie
- リクエストヘッダー:
cookie
- クライアントブラウザがサーバーにアクセスすると、サーバーはHTTP応答にSet-Cookie
响应头字段
を追加して、データ情報をブラウザに送信します。 - ブラウザは応答結果を取得した後、
Set-Cookie
応答ヘッダーから対応する値を取得し、ブラウザのメモリまたはハードディスクにCookieを保存できます。 - サーバーが再度要求されると、ブラウザはHTTP要求メッセージにCookie
请求头字段
を追加することにより、CookieをWebサーバーに送り返します。 - サーバーはCookie情報に従ってクライアントのステータスを追跡し、RequestオブジェクトはRequestヘッダーのCookieに対応する値をCookieオブジェクトにカプセル化し、最後にCookie配列を形成します。
- ブラウザにCookieを送信します
- ブラウザのキャッシュからCookieを取得する
2.Cookieの使用状況の詳細
1️⃣クッキーの寿命
デフォルトでは、Cookieはブラウザのメモリに保存されます。ブラウザを閉じてメモリを解放すると、Cookie、つまりセッションレベルのCookieが破棄されます。
クッキーの保存時間を設定する
- Cookieの存続時間、つまり永続的なCookieを設定します。この時点で、Cookieはに保存さ
电脑磁盘
れます。
// 单位:秒
setMaxAge(int seconds)
复制代码
- 秒のパラメータ設定詳細
-
正数
:将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 的数量和长度是有限制的。