目次
2° httpSession.setAttribute(文字列名, オブジェクト値);
3° オブジェクト obj = httpSession.getAttribute(文字列名);
4° httpSession.removeAttribute(文字列名) :
2. getSession() メソッドの基礎となるメカニズムの図:
1. セッションの紹介
1.セッションとは何ですか?
(1)セッションはサーバー側のテクノロジです。つまり、セッション データはサーバー側に保存され、サーバーは実行時に各ユーザーのブラウザに専用のセッション オブジェクト
(2)セッションオブジェクトは各ユーザーのブラウザ専用であるため、各ユーザーはサーバーの異なるページにアクセスするときに各セッションからデータを読み取り/追加し、関連するデータを独自に操作することができます。
(3)セッションを利用することで、オンラインショッピングモールのショッピングカート情報やWebサイトログインユーザー情報などを保存することができます。また、ユーザーによる特定ページへの不正ログインを防止することもできます。
2.セッションの基本原則:
概略図は次のとおりです。
1° ユーザーがブラウザを開いて Web サイトにアクセスし、セッションを操作すると、サーバーはサーバー側のメモリ内でブラウザに固有のセッション オブジェクトを割り当て、そのセッション オブジェクトはブラウザによって排他的に占有されます。
2° セッション オブジェクトはコンテナ/コレクションとみなすこともでき、セッション オブジェクトのデフォルトの存在時間は 30 分 (サーバー側) です。(Tomcat インストール ディレクトリの conf/web.xml 設定ファイルを通じて変更できます)
3.セッションとはどのようなものですか?
セッションは HashMap に似たコンテナであり、(キーと値のペア) も格納され、各行はセッションの属性です。各属性には 2 つの部分が含まれており、前者は属性の名前 (文字列型)、後者は属性の値 (オブジェクト型) です。
以下に示すように:
2. セッションの基礎となるメカニズム
1. セッションインターフェイスに関連するメソッド:
1° req.getSession() :
HttpSession httpSession = req.getSession() ; このメソッドは、実際には Session インターフェイスを実装する実装クラス オブジェクトである Session オブジェクトを返すために使用されます。このメソッドへの最初の呼び出しはセッションを作成するために行われ、後続の呼び出しは作成されたセッション オブジェクトを取得するために行われます。
2° httpSession.setAttribute(文字列名, オブジェクト値);
このメソッドは、 Session オブジェクトにプロパティを追加するために使用されます。
3° オブジェクト obj = httpSession.getAttribute(文字列名);
Object obj = httpSession.getAttribute(String name);ポリモーフィックな下向き変換も考慮できます。このメソッドは、Session オブジェクトから特定の属性を取得するために使用されます。
4° httpSession.removeAttribute(文字列名) :
このメソッドは、Session オブジェクトから属性を削除するために使用されます。
5° isNew() :
このメソッドは、新しく作成された Session オブジェクトであるかどうかを判断するために使用されます。
6° getId() :
各 Session オブジェクトには、JSESSIONID という一意の ID 値があり、getId() を通じてセッションのセッション ID 値を取得できます。
2. getSession() メソッドの基礎となるメカニズムの図:
模式図は以下の通りです(計3行)
手書きの Tomcat の基礎となるメカニズムのコンテナの実装メカニズム に問い合わせてください。
3.JSESSIONID パケット キャプチャの例:
1° セッションの作成
CreateSessionServlet クラスのコードは次のとおりです。
package bottom;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author : Cyan_RA9
* @version : 21.0
*/
@WebServlet(urlPatterns={"/createSession"})
public class CreateSessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session对象(也可能是创建)
HttpSession httpSession = req.getSession();
System.out.println("httpSession = " + httpSession);
//获取Session对象的Id
String sessionId = httpSession.getId();
System.out.println("sessionId = " + sessionId);
//向Session容器中存放数据
httpSession.setAttribute("fruit", "Grape");
//回显
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>Getting the session!</h1>");
writer.flush();
writer.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
実行時の効果は次のとおりです (GIF):
2° 読み取りセッション
ReadSessionServlet クラスのコードは次のとおりです。
package bottom;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author : Cyan_RA9
* @version : 21.0
*/
@WebServlet(urlPatterns={"/readSession"})
public class ReadSessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession httpSession = req.getSession();
System.out.println("Read's sessionId = " + httpSession.getId());
//传入name来获取Session属性
Object fruit = httpSession.getAttribute("fruit");
if (fruit != null) {
System.out.println("Session属性fruit = " + (String) fruit);
} else {
System.out.println("找不到\"name = fruit\"的session属性!");
}
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>Reading the session!</h1>");
writer.flush();
writer.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
実行時の効果は次の GIF のようになります: (最初に属性を作成してから属性を取得することに注意してください。)
3. セッションのライフサイクル
1.基本機能:
1° public void setMaxInactiveInterval(int interval):セッションのタイムアウトを設定します (秒単位)。指定された時間を超えると、セッションは破棄されます。
間隔値が正の数の場合、セッション タイムアウト期間を設定します。
間隔値が負の数値の場合、セッションがタイムアウトしないことを意味します
2° public int getMaxInactiveInterval(): セッションのタイムアウト時間を取得します
3° Public void validate(): 現在のセッションを直ちに無効化します
4° If setMaxInactiveInterval() は呼び出されません セッションの存続期間を指定します。Tomcat はデフォルトのセッション期間を標準として使用します。デフォルトのセッション タイムアウトは30 分で、tomcat の web.xml で設定できます。
2.詳細:
1° セッションのライフ サイクルは、 累積期間ではなく、クライアント / ブラウザによる 2 つのリクエスト 間の最大間隔を指します 。つまり、クライアントが独自のセッションにアクセスすると、セッションライフ サイクルは0から再計算されます。つまり、同じセッションに対する 2 つのリクエスト間の時間間隔を指します。2° Tomcat は、下部のスレッドを使用してセッション ステータスをポーリングします。セッションのアイドル時間が設定された最大値を超えると、セッションは破棄されます。
3. 応用例:
CreateSession_EX クラスのコードは次のとおりです。
package lifetime;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns={"/createEX"})
public class CreateSession_EX extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession httpSession = req.getSession();
System.out.println("CreateEX's sessionId = " + httpSession.getId());
//设置Session对象的生命周期 = 30s
httpSession.setMaxInactiveInterval(20);
//设置Session对象的属性
httpSession.setAttribute("animal", "Cat");
//回显给浏览器
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>创建Session!生命周期20s。</h1>");
writer.flush();
writer.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
ReadSession_EX クラスのコードは次のとおりです。
package lifetime;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns={"/readEX"})
public class ReadSession_EX extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession session = req.getSession();
System.out.println("ReadEX's sessionId = " + session.getId());
int maxInactiveInterval = session.getMaxInactiveInterval();
System.out.println("当前Session生命周期 = " + maxInactiveInterval);
//获取Session中的属性
Object animal = session.getAttribute("animal");
if (animal != null) {
System.out.println("animal = " + (String) animal);
} else {
System.out.println("原先的Session已经被销毁!");
}
//回显
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>读取Session!</h1>");
writer.flush();
writer.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
ランニング効果:(下のGIF)
System.out.println("END------------------------------------------ -------------------------------------------------- ------------------------");