JavaWeb〜サーブレット〜Cookieの深い理解

クッキーとは

HTTPプロトコル自体はステートレスです。つまり、クライアントとサーバーの間に永続的な接続を確立する必要はありません。つまり、クライアントはサーバーへの要求を開始し、サーバーは応答を返します。応答が返された後、接続は閉じられ、この接続に関連する情報は保持されません。つまり、HTTP要求はクライアントからサーバーにのみ開始でき、サーバーはクライアントにデータを送信できません。つまり、サーバーは要求されたID情報を識別できません。

Cookieは、実際には小さなテキスト情報であり、Key-Value形式で編成された文字列の文字列です。
クライアントがサーバーにリクエストを送信した後、サーバーがリクエストのID情報を記録するか、ユーザーステータスを記録する必要がある場合、対応するリクエストにCookieを発行します。URLとCookieは一緒にサーバーに送信されます。サーバーはCookieをチェックして、ユーザーのステータスを確認します。

これは銀行カードに似ています。初めて銀行に行くと、銀行から銀行カードが渡されます。このカードには、身元情報、電話番号、パスワードなどの情報が保存されています。銀行の場合、関連するビジネスを処理するために銀行カードを直接表示できます。
病院に行って医師の診察を受けるときの医療カードのようなものです。初めて医師の診察を受けるときは、医療カードを申請する必要があります。身分証明書や残高などはに保存されています。カード。あなたの身元を知るために。

クッキーのしくみ

Cookieは、一部のデータを保存できるローカルブラウザによって提供される機能です。クッキーは実際にはブラウザに保存されるプレーンテキストです。ブラウザのインス​​トールディレクトリには、各ドメインに設定されたクッキーを保存するための特別なクッキーフォルダがあります
。Webページがリクエストを送信する場合、ブラウザは最初にそこにあるかどうかを確認します。は応答Cookieであり、一部はリクエストヘッダー(リクエストヘッダー)のCookieフィールドに自動的に追加されます。このプロセスは、ブラウザーによって自動的に完了します。ブラウザは、リクエストが行われるたびにこれを行います。

初めてWebサイトにアクセスしてログインするとき、Cookieの設定は次の手順で行われます。

  • クライアントがサーバーにリクエストを送信します
  • サーバーは応答+Set-Cookieフィールドを返します
  • クライアントはCookieを保存します
  • クライアントがサーバーにリクエストを送信すると、リクエストヘッダーにCookieが自動的に追加されます
  • サーバーはリクエストID情報を認識し、データを直接送信します。
    ここに画像の説明を挿入
    このコードを使用して、単純に検証し、doGetメソッドで新しいCookieを作成し、パケットキャプチャオブザベーションにアクセスします。
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;

@WebServlet("/testCookie")
public class TestCookie extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        Cookie cookie=new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        //设置生命周期为MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }
}

パケットをキャプチャしてリクエストの内容を表示すると、リクエストにCookieがあり、返された応答にSet-Cookieがあることがわかります。
ここに画像の説明を挿入
ここに画像の説明を挿入

クッキー属性

Cookie自体には、Cookieの有効期限、ドメイン名、送信先のパスなど、いくつかの属性があります。Cookieを設定する場合、これらの関連属性を設定できます。設定しない場合は、これらのデフォルト値を使用します。プロパティ。分号設定すると、プロパティはaとaで区切られ空格ます。

プロパティアイテム プロパティアイテムの紹介
NAME = VALUE キーと値のペア。保存するキー/値を設定できます。この名前を他の属性名と同じにすることはできないことに注意してください。
有効期限 クッキーの有効期限を設定する
ドメイン domain="www.sogou.com"などのドメイン名を設定します
設定されたCookieのパス(path = / wp-admin /など)
安全 セキュリティを設定します。このプロパティが設定されている場合、CookieはSSH接続が確立されたときにのみ送信されます

フォーマット例:

"key=name; expires=Thu, 25 Feb 2016 04:18:00 GMT; domain=ppsc.sankuai.com; path=/; secure; HttpOnly"

これらのプロパティの詳細を以下に説明します
。expiresexpires
オプションは、Cookieの有効期限を設定するために使用されます。設定する場合、有効期限はGMT形式の時刻に設定する必要があります。
GMT時刻の設定は、新しいDate()。toGMTString()メソッドまたは新しいDate()。toUTCString()メソッドで取得できます。

たとえば、expires = Thu、25 Feb 2020 04:18:00 GMTは、Cookieが2020年2月25日の4.18分後に期限切れになり、期限切れのCookieがブラウザによって自動的にクリアされることを意味します。このオプションが設定されていない場合、デフォルトの有効期間はセッション、つまりセッションcookieであり、ブラウザを閉じると消えます。

有効期限はhttp/1.0プロトコルのオプションであり、新しいhttp / 1.1プロトコルではmax-ageオプションに置き換えられました。どちらも、Cookieの有効時間を制限するために使用されます。

maxAgeは、Cookieの有効期間を時間と秒で示します。Cookieは、このプロパティを操作するための2つのメソッドを提供します。1つは、このプロパティを読み書きするためのgetMaxAge()とsetMaxAge(int maxAge)です。

max-age、正、負、0の3つの値があります

maxAgeの値が正の場合、CookieはmaxAge秒後に自動的に期限切れになることを意味します。ブラウザは、maxAgeが正の数であるCookieを保持します。つまり、ローカルのCookieフォルダに書き込みます。書き込まれると、ユーザーがコンピュータを閉じてもブラウザを閉じても、maxAge秒より前である限り、CookieはWebサイトにログインすると保存されます。引き続き機能します。

以下のコードのようなCookieは永久に有効です。

   Cookie cookie=new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        //设置生命周期为MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);

maxAgeの値が負の場合、Cookieは一時的なCookieであり、永続化されず、現在のウィンドウまたはサブウィンドウでのみ有効であることを意味します。ブラウザを閉じると、Cookieはすぐに無効になります。

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // MaxAge为负数,是一个临时Cookie,不会持久化
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);

maxAgeが0の場合、Cookieがすぐに削除されることを意味します

        Cookie[] cookies = req.getCookies();
        Cookie cookie = null;

        // get Cookie
        for (Cookie ck : cookies) {
    
    

            if ("mcrwayfun".equals(ck.getName())) {
    
    
                cookie = ck;
                break;
            }
        }

        if (null != cookie) {
    
    
            // 删除一个cookie
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }

ドメインとパス
ドメインはドメイン名、パスはパス、2つの合計はURL、ドミナとパス制限であり、これらのURLからCookieにアクセスできます。

リクエストされたURLのドメイン名が「sogou.com」または「api.baidu.com」、「dev.api.baidu.com」などのサブドメインである場合、Cookieのドメイン属性をsogou.comに設定するとします。 、およびURLパスは「/」またはサブパス「/ home」、「/ home / login」であり、ブラウザはこのCookieをリクエストのCookieヘッダーに追加します。

これらのプロパティのどちらも設定されていない場合は、デフォルト値が使用されます。ドメインのデフォルト値は、Cookieが配置されているWebページのドメイン名に設定されます。パスのデフォルト値は、Cookieページが配置されているディレクトリに設定されます。

セキュア
セキュア属性は、Cookieがセキュアリクエストでのみ送信されるようにするために使用されます。通常、この属性はデフォルトで空です。HTTPプロトコルかHTTPSプロトコルかに関係なく、Cookieはリクエストヘッダーに追加されます。この属性が設定されている場合、次に、接続がSSHで保護されている場合にのみ、Cookieがリクエストに追加されます。

クッキーの使い方

クッキーの変更と削除

HttpServletResponseによって提供されるCookie操作には、addCookie(Cookie cookie)という1つの追加操作しかあり
ません。したがって、Cookieを変更する場合は、同じ名前のCookieのみを使用して、元のCookieを上書き
できます。Cookieを削除する場合、同じ名前で新しいCookieを作成し、その有効期間maxAgeを0に設定して、元のCookieを上書きするだけです。

新しいCookieは、valueとmaxAgeを除き、名前、パス、ドメインなどの他の属性は、変更または削除の効果を実現するために元のCookieと一致している必要があります。一致していない場合、ブラウザはそれを2つのCookieと見なし、上書きされません。

クッキーを設定する

Cookieは、クライアントまたはサーバーによって設定できます。

サーバー側の設定

クライアントがリソースファイルを要求するか、ajax要求を送信するかにかかわらず、サーバーは応答を返します。
応答ヘッダーのset-cookieは、cookieを設定するために特別に使用されます。次の
図に示すように、5つのset-cookieフィールドがあります。応答ヘッダー。その後、各フィールドはそれに応じてCookieを設定します。set-cookieの値は通常の文字列です。
ここに画像の説明を挿入
set-Cookieフィールドは1つのCookieのみを設定できます。複数のCookieを設定する場合は、複数のset-Cookieフィールドを追加する必要があります。また、このフィールドでは、Cookieのすべてのプロパティを設定できます。

クライアント設定

クライアント側では、JavaScriptコードを使用して設定できます。

次のコード:

document.cookie = "name=Jonh; ";

コンソールでは、Cookieが正常に設定され、ドメイン、パス、および有効期限のデフォルト値が使用されていることがわかります。
ここに画像の説明を挿入

複数のCookieを設定する場合、コードは次のとおりです。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script>

  //设置了5个Cookie
    document.cookie = "name=Jonhs; ";
    document.cookie = "name=Jonh; age=12; class=111";
    document.cookie = "name=Jonh";
    document.cookie = "age=12";
    document.cookie = "class=111";
</script>
</body>
</html>

セットアップは成功しました。
ここに画像の説明を挿入

クッキーに入れるのに適したデータの種類

Cookieに保存されたデータは、ブラウザによって毎回自動的にhttpリクエストに配置されます。リクエストが行われるたびにデータをサーバーに送信する必要がない場合、ブラウザによるこの自動処理により、間違いなくオーバーヘッドが増加します。ただし、これらのデータをリクエストごとにサーバーに送信する必要がある場合、ブラウザによるこの自動処理により、繰り返し追加する操作を大幅に節約できます。
したがって、各リクエストに必要なデータは、Webページのログイン機能を実装するためにも一般的に使用される一般的な認証情報などのCookieに配置するのに適しています。

各ドメイン名での最大Cookieサイズは4KB、各ドメイン名での最大Cookie数は20です(一部のブラウザは20以上をサポートしています)

クッキーフォーマット

Cookie自体はブラウザに保存される文字列であり、形式はkey = valueで構成されるキーと値のペアに似ており、キーと値のペア分号空格aとaで区切られます。

参考記事:
https ://blog.csdn.net/playboyanta123/article/details/79464684
https://www.jianshu.com/p/6fc9cea6daa2

おすすめ

転載: blog.csdn.net/Merciful_Lion/article/details/123601379