1️⃣クッキーテクノロジー
1.1クッキーオブジェクト
- セッションデータを保存するためのCookieオブジェクトを作成します
new Cookie(String name, String value)
- クッキーオブジェクトを変更する
void setPath(String url)
void setMaxAge(int expiry)
void setValue(String newValue)
- クッキーデータをブラウザに送信して保存します
response.addCookie(cookie);
- ブラウザはCookieを使用してサーバーにアクセスし、サーバーはCookie情報を受信します
request.getCookies();
1.2クッキーテクノロジーの原則
- サーバーはCookieオブジェクトを作成し、セッションデータを保存して、Cookieデータをブラウザに送信します。
response.addCookie(cookie); // (响应头:set-cookie: name=iacky)
- ブラウザはCookieデータを取得してブラウザのキャッシュに保存し、次回サーバーにアクセスしたときにCookieデータを伝送します。
(请求头: cookie: name=chen)
- サーバーは、ブラウザから送信されたCookieデータを取得します。
request.getCookies();
1.3クッキーの詳細。
- Cookieのデータ型は文字列である必要があります。中国語を送信する場合は、送信する前にまず中国語のURLを暗号化する必要があります。
- setPath(path):Cookieが配置されている有効なパスを変更します。
- 有効なパスとは何ですか?
Cookieが有効なパスに設定されている場合、ブラウザがこの有効なパスにアクセスすると、Cookieデータがサーバーに送信されます。
- setMaxAge(integer):Cookieの有効時間を設定します
- 正の整数:時間が正の整数の値を超えると、Cookieが失われることを示します!!(Cookieはブラウザのキャッシュディレクトリに保存されます)単位:秒。
- 負の整数:ブラウザを閉じると、Cookieが失われることを意味します!(Cookieはブラウザのメモリを節約します)
- 0:同じ名前のCookieを削除することを意味します
- 複数のCookieが存在する可能性がありますが、ブラウザでは通常300個のCookieしか保存できず、各サイトでは最大20個のCookieを保存でき、各Cookieのサイズは4KBに制限されています。
1.4テンプレートコード
public class Cookiedemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 创建Cookie对象,保存会话数据
// 如果发送中文,必须先使用URLEncoder进行加密
String name = URLEncoder.encode("张三", "utf-8");
Cookie c1 = new Cookie("name", name);
Cookie c2 = new Cookie("email", "[email protected]");
// 发送cookie
response.addCookie(c1);
response.addCookie(c2);
// 浏览器下次访问获取已有的cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
// cookie的名
String cname = cookie.getName();
// cookie的值
String cvalue = cookie.getValue();
// 解密
cvalue = URLDecoder.decode(cvalue, "utf-8");
System.out.println(cname + "=" + cvalue);
}
} else {
System.out.println("没有cookie信息!");
}
}
}
1.5クッキーケース
2️⃣セッションテクノロジー
概念:セッションは、サーバーとブラウザー間のセッションを表します。このプロセスは継続的または断続的です。サーブレットでは、セッションはHttpSessionクラスのオブジェクトを参照します。
2.1セッションデータ構造
サーブレット/ jspでは、コンテナはセッション関連の変数を格納するためにどのデータ構造を使用しますか?セッションはマルチスレッド環境のスレッド間で共有され、Webサーバーは通常マルチスレッドであるため(パフォーマンスを向上させるためにプールテクノロジーも使用されます)、まず、同期的に操作する必要があると推測します。 、thisデータ構造は操作が簡単である必要があり、できれば従来のキーと値のペアのアクセス方法です。
それでは、最初に単一のセッションオブジェクトに焦点を当てましょう。IDなどの独自の関連情報を格納することに加えて、Tomcatのセッションはプログラマに他の情報を格納するためのインターフェイスも提供します(在类org.apache.catalina.session. StandardSession里)
。
public void setAttribute(String name, Object value, boolean notify)
ここでは、使用するデータの種類を追跡できます。
protected Map attributes = new ConcurrentHashMap();
これは非常に明確であり、TomcatがConcurrentHashMap
オブジェクトを使用してデータを格納する場合、2つのポイントを満たす必要があります。簡単に同期することです。
では、Tomcatはすべてのセッションオブジェクトを格納するためにどのデータ構造を使用しますか?
- または
ConcurrentHashMap
(在管理session的org.apache.catalina.session. ManagerBase类里)
:
protected Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();
2.2セッション作成手順/作成時間/削除時間/保守方法:
手順:
JSPページでセッションが明示的に禁止されていない場合、ブラウザを開いて初めてJSPを要求するとき:
- サーバーは自動的にそのセッションを作成し、それにsessionIDを与えます
- クライアントのブラウザに送信されます。その後、クライアントがこのアプリケーションの他のリソースを要求すると、要求ヘッダーに次のものが自動的に追加されます。
Cookie:JSESSIONID=客户端第一次拿到的session ID
- サーバーはリクエストを受信すると、セッションIDを受信し、IDに従ってメモリ内で以前に作成されたセッションオブジェクトを検索し、それをリクエストに提供します。これは、セッション使用の基本原則でもあります。
再現されたより詳細な手順:
-
ユーザーがjspページを要求し、ページはsession = "true"で設定されます。
-
サーブレット/ jspコンテナはそれをサーブレットに変換し、サーブレットをロードして実行します。
-
サーブレット/ jspコンテナがHttpServletRequestオブジェクトをカプセル化すると、CookieまたはURLにjsessionidがあるかどうかに基づいて、現在のセッションをHttpRequestにバインドするか、新しいセッションオブジェクトを作成するかが決定されます。
-
プログラムはオンデマンドでセッションを操作し、データにアクセスします。
-
新しく作成されたセッションの場合、結果の応答で、コンテナーはSet-cookieヘッダーを追加して、ブラウザーにセッションを維持するように通知します(または、URL書き換えを使用して新しいリンクをユーザーに提示します)。
上記の説明を通じて、読者はセッションがいつ作成されたかを理解する必要があります。サーブレットレベルからの要約は次のとおりです。ユーザーが要求したサーブレットがgetSessionメソッドを呼び出すと、セッションが取得されます。新しいセッションを作成するかどうかについては、現在のリクエストがセッションにバインドされているかどうかによって異なります。クライアントがjsessionid識別子をリクエストに追加し、サーブレットコンテナがこの識別子に基づいて対応するセッションオブジェクトを見つけると、セッションはこのリクエストのリクエストオブジェクトにバインドされ、クライアントリクエストにはjsessionidまたは対応するjsessionidが含まれません。セッションの有効期限が切れており、セッションのバインドを完了できないため、この時点で新しいセッションを作成する必要があります。同時に、Set-cookieヘッダーが送信され、新しいセッションの維持を開始するようにクライアントに通知します。
作成時間:
よくある誤解は、クライアントがセッションにアクセスしたときにセッションが作成されるというものですが、真実は次のとおりです。
- ユーザーが要求したサーブレットがgetSessionメソッドを呼び出すと、セッションが取得されます。新しいセッションを作成するかどうかは、現在の要求がセッションにバインドされているかどうかによって異なります。
- クライアントがjsessionid識別子をリクエストに追加し、サーブレットコンテナがこの識別子に基づいて対応するセッションオブジェクトを見つけると、セッションはこのリクエストのリクエストオブジェクトにバインドされ、クライアントリクエストにはjsessionidまたは対応するjsessionidが含まれません。セッションの有効期限が切れており、セッションのバインドを完了できないため、この時点で新しいセッションを作成する必要があります。同時に、Set-cookieヘッダーが送信され、新しいセッションの維持を開始するようにクライアントに通知します。
削除時間:
セッション破棄には、タイムアウトと手動破棄の2つの状況があります。
-
セッションタイムアウト:タイムアウトとは、サーバーがセッションに対応するクライアントからの要求を一定期間受信しておらず、この時間がサーバーによって設定された最大セッションタイムアウトを超えていることを意味します。
-
プログラムコール
HttpSession.invalidate()
-
サーバーがダウンしているか、サービスが停止しています
保守方法:
セッションが初めて作成されると、クライアントは後続のリクエストでセッションIDをサーバーにもたらします。サーバープログラムはセッションが必要なときにgetSessionを呼び出すことができ、サーバーは対応するセッションをにバインドできます。状態の維持を達成するために、現在の要求。もちろん、これにはクライアントのサポートが必要です。Cookieが無効になっていて、URL書き換えが使用されていない場合、セッションを維持できません。
接続を維持するために、各リクエストのURLリクエストヘッダーにjsessionidを追加してURLを書き換えます
サーブレットが複数のリクエスト間でgetSessionを呼び出さない場合(または単に静的ページをリクエストする場合)、セッションは中断されますか?クライアントは正当なCookie値のみをサーバーに送信するため、これは発生しません。サーバーがCookieをどのように処理するかについては、サーバーはそれを気にしません。もちろん、それはできません。セッションが確立された後、要求されたページが動的、静的、または画像であるかどうかに関係なく、クライアントは常にセッション識別子をサーバーに送信します。
2.3セッションの使用手順。
HttpSessionオブジェクト:
- セッションデータを保存するHttpSessionオブジェクトを作成します
session = request.getSession(); 创建或获取session对象。
- HttpSessionオブジェクトを変更します
void setMaxInactivelnterval(int interval)设置session对象的有效时间。
void invalidate() 手动销毁session对象
- セッションデータを(ドメインオブジェクトとして)保存する
session.setAttribute("name",Object); 保存数据
session.getAttribute("name") 获取数据
session.removeAttribute("name") 删除数据。
2.4テンプレートコード
2.5セッションの原則
- 質問:サーバーは異なるブラウザセッションをどのように区別しますか?
- 前提条件:セッションオブジェクトから取得できるデータは、データを格納するセッションオブジェクトである必要があります!!!
次のように、同じブラウザで同じページを開き、異なるブラウザで同じページを開いたときのセッション結果を見つけることができますか。
- ブラウザ1-ウィンドウ1(001):
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
- ブラウザ1-ウィンドウ2(001):利用可能
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
- ブラウザ2:利用できません
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
- 新しいブラウザ1(マークなしまたは001ではない):使用不可
//1 创建HttpSession对象
HttpSession session = request.getSession()
//2 保存会话数据。
session.setAttribute("name"," jacky");
2.6セッションの詳細
- setMaxinactiveInterval(seconds):セッションオブジェクトの有効時間を設定します。
- 質問:セッションはどこで破棄されますか?
- 注:ブラウザを閉じないと、セッションオブジェクトは破棄されます!!!
- デフォルト:セッションオブジェクトが破棄される前に、30分のアイドル時間待機します。
<!--设置全局的session对象的过期时间(分钟)-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
- ブラウザを閉じてもJSESSIONIDは消えません
/*设置JSESSIONID的时间,不会随着浏览器关闭而丢失!*/
Cookie c = new Cookie ("JSESSIONTD",session.getId());
c.setMaxAge (1*30*24*60*60) ; //1个月
response.addCookie(c);
- sessinoオブジェクトを直接手動で破棄しますv
invalidate( );
- セッションオブジェクトを作成または取得する
创建或得到session对象,查询session对象
request.getSession() / request.getSession(true)
如果没有sessino对象,则创建新的session对象
request.getSession(false)
得到session对象,查询session对象,如果没有session对象,直接返回null
2.7セッションの原則
このコード行には、次の6つのステップが含まれています
HttpSession session = request.getSession();
- サーバーはSessionオブジェクトを作成し、サーバーは一意のタグJSESSIONIDをセッションオブジェクトに割り当てます。
- JSESSIONIDをCookieとしてブラウザに送信します
- ブラウザはJSESSIONIDを取得して保存し、このJSESSIONIDを伝送して、次回のアクセス時にサーバーにアクセスします。
- サーバーはJSESSIONIDを取得し、サーバーメモリ内で指定されたJSSESSINOIDを持つセッションオブジェクトを検索します
- 見つかった場合は、このセッションオブジェクトを返します
- 見つからない場合は、直接nullを返すか、新しいセッションオブジェクトを作成する可能性があります。
3️⃣CookieとSessionの類似点と相違点
Cookieとセッションの両方がサーブレットパッケージの下のサブパッケージに属します
3.1機能
クッキーの機能:
- セッションデータはブラウザ側に配置されます
- データ型は文字列のみであり、サイズ制限があり、データストレージにとって比較的安全ではありません
セッションの特徴:
- セッションデータはサーバー側(サーバーメモリ)に配置され、サーバーリソースを占有します
- 任意のデータ型、サイズ制限なし
- 比較的安全
3.2保管場所
クッキー:ブラウザ
セッション:サーバー