セッション実装原則の詳細な議論

1.Session実装機構
サーバーは、サービスとして、ユーザーのブラウザセッションを達成する方法ですか?

セッション原理の模式図

説明:
ブラウザーAが最初にServlet1にアクセスすると、ID番号110のセッションが作成され、次にServlet1はこのID番号をCookieの形式でブラウザーAに返します。このリクエストはCookie値JSESSIONID = 110をもたらし、サーバーはブラウザAから渡されたID番号に従ってメモリ内のセッションを見つけます。
この時点で、ブラウザBがServlet1にアクセスするようになった場合、そのリクエストはJSESSIONIDのCookie値をもたらしませんでした。これもSessionを使用しているため、サーバーは新しいセッションを作成し、ID番号は119で、このID番号はCookieです。ブラウザBに戻ります。その後のプロセスはAと同じです。

この原則については、[セッションの基本知識(1)]のServlet1とServlet2で説明しています。Servlet1はセッションの作成と属性の追加に使用され、Servlet2はセッションの属性の読み取りに使用されます。
次に、Servlet1にアクセスしてパッケージをキャプチャします。

セットクッキー

ご覧のとおり、リクエストヘッダーにはCookie情報がなく、レスポンスヘッダーにもそのような文があります。

Set-Cookie:JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2; パス= / Session1 /; HttpOnly

これは、サーバーがCookieを介してJSESSIONID属性をクライアントに渡したことを示しています。

次に、Servlet2にアクセスして、次のようにパッケージをキャプチャします。

クッキー

Set-Cookieヘッダーが応答ヘッダーに表示されず、Cookieヘッダーが要求ヘッダーに含まれていることがわかります。

Cookie:JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2

このヘッダーにはJSESSIONIDが含まれており、その値は以前のSet-CookieのJSESSIONIDの値です。
これは、前に説明したセッションの原理、つまりサーバーがブラウザーごとに異なるセッションを区別できるメカニズムを証明しています。

しかし、ここで別の問題があります:前に、Cookieが複数のブラウザーで共有されると述べましたが、JSESSIONIDはCookieとしてクライアントに保存されるので、複数のブラウザーで共有できないのはなぜですか?

JSESSIONIDを格納するためのこのCookieは、永続的なCookieではなく、セッションCookieです。Cookieを学習するときに、Cookieのライフサイクルを設定する方法を学びました。Cookieのライフサイクルが設定されている場合、Cookieはディスクファイルに書き込まれ、ライフサイクルが終了するまで保存された後、自動的に消去されます。 Cookieのライフサイクルが設定されていない場合、このCookieはセッションCookie、つまりセッションCookieであり、ブラウザが開かれている間のみ存在します。ブラウザが閉じられると、Cookieは消えます。
つまり、セッションCookieはブラウザのメモリに存在し、ブラウザを閉じると消えます。したがって、JSESSIONIDはセッションCookieにも存在するため、当然、複数のブラウザで共有することはできません。

では、ブラウザを閉じてブラウザを開き、今すぐページにアクセスしても、このページで情報を保存することはできますか?たとえば、IEを閉じてからIEを開いても、最後に購入した製品がまだ残っています。

分析、プログラムでセッションライフサイクルを設定していない場合、そのライフサイクルはデフォルトの30分の時間であり、ブラウザーが閉じている場合、以前に導入されたセッション実装メカニズムによると、サーバーはブラウザーがこの時点で閉じられているかどうかを認識しません。はい、つまり、サーバー側のセッションはまだ存在しており、30分後まで破棄されません。
したがって、この時点でCookieを持っている場合:JSESSIONID = 2150AE444BF83FDACEA04BD0289F5AE2、ブラウザが閉じる直前のページに移動しても、サーバーは前のセッションを見つけて関連データを提供できます。

上記の分析を通じて、この機能はセッションとCookieの組み合わせを使用して実現できます。

次に、Servlet1とServlet2を変更します。
Servlet1でセッションを設定し、属性を追加して、Cookieを介してセッションのIDをクライアントに返します。Cookieの名前は「JSESSIONID」で、値はセッションのIDです。このIDは、セッションを介して直接渡すことができます。 getId()を取得します。、そのdoGetメソッドは次のとおりです。

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();

    //创建一个session,默认生命周期为30min,并放入一个属性
    HttpSession session = request.getSession();
    session.setAttribute("name", "小明");
    out.println("创建Session成功,并放入了一个值");

    // 把该sessionid保存在cookie
    // 这个cookie的键为JSESSIONID
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(3600);
    response.addCookie(cookie);
}

Servlet2は変更されないままですが、この属性を取得するためにセッションに移動します。実験では、ブラウザを閉じた後、もう一度ブラウザを開いてServlet2にアクセスし、セッションの値を引き続き取得できることが示されています。

テスト中

その理由は、サーブレット1がJSESSIONIDをcookieによってディスクファイルに保存したためです。セッションの実現メカニズムを理解し、これを理解することは難しくありません。

無効にクッキーセッション・プロセスへのユーザーの後2.
ユーザーのブラウザが行う方法クッキーを無効にする場合は、状況は、ありますか?たとえば、次のようにChrome Cookieを無効にしました。

クッキーを無効にする

現時点で、ショッピングサイトなどの大規模なWebサイトにアクセスすると、Webサイトの多くの機能が正常に実現できなくなっていることがわかります。たとえば、JDにログインすると、次の図に示すように、サーバーが入力した確認コードを取得できません。

JDのヒント

理由は非常に単純です。私がCookieを無効にしたので、同じように、CookieがJSESSIONIDを保存できないため、サーバー側セッションを使用できません。

[サーブレット(2)シンプルなアプリケーション]の最後のシンプルなショッピングカートの例に戻りますが、Cookieを無効にすると、ショッピングカートで毎回購入したばかりの本が1つしかなく、前の本は見つかりません。理由は同じなので、この状況を解決するにはどうすればよいですか?

解決策:URLの書き換え

サーブレットの応答は、URLを書き換える方法を提供します。

response.encodeRedirectURL(文字列url)-sendRedirectメソッドの後にURLアドレスを書き換えるために使用されます。response.encodeURL(文字列url)
-フォームアクションとハイパーリンクのURLアドレスを書き換えるために使用されます。

では、URLの書き換えとはどういう意味ですか?実際、JSESSIONIDは人為的にURLに追加されます。たとえば、以前に作成した単純なショッピングカートを変更した場合、ShowBookのすべてのクリックして購入するハイパーリンクを書き換える必要があります。
これは以前に書きました:

out.println("<tr><td>"+book.getName()+"</td><td><a href='/MyCart/BuyBookCl?id="+book.getId()+"'>点击购买</a></td></tr>");

次に、URLを書き換えます。

request.getSession();
String url = "/MyCart/BuyBookCl?id="+book.getId();
url = response.encodeURL(url);
out.println("<tr><td>"+book.getName()+"</td><td><a href='"+url+"'>点击购买</a></td></tr>");

request.getSession()メソッドは、書き換える前に呼び出すか確認する必要があることに注意してください。

これらのリンクの違いは、ソースコードファイルで確認できます。書き換える前のShowBookにアクセスするためのソースコードは次のようになります。

URL書き換え前のShowBookソースコード

書き換え後:

URL書き換え後のShowBookソースコード

URLが書き換えられた後、jsessionidパラメータが自動的にURLに追加され、Cookieが無効になっているときにセッションが引き続き正常に使用されることが確認できます。このとき、ショッピングカートのアドレスバーを次のように確認します。jsessionidパラメータがはっきりとわかります。

ShowMyCart
からの転送

元の記事を17件公開 24 件を獲得 28万回以上表示

おすすめ

転載: blog.csdn.net/qq_22956867/article/details/79415953