セッション
1.セッションとは何ですか?
- セッションは単なるインターフェース(HttpSession)です。
- セッションはセッションです。これは、クライアントとサーバー間の関連付けを維持するために使用される手法です。
- 各クライアントには独自のセッションセッションがあります。
- セッションセッションでは、ユーザーがログインした後に情報を保存するためによく使用されます。
2.セッションを作成して取得する方法(ID番号、新しいですか)
セッションを作成して取得する方法。それらのAPIは同じです。
request.getSession()
の最初の呼び出しは、セッションを作成することです。
その後のすべての呼び出しは、以前に作成されたSessionオブジェクトを取得することです。
isNew();
作成されたばかりか(新規)を判別します。Trueは作成され
たばかりであることを意味します。False
は取得前に作成されたことを意味します。
各セッションにはID番号があります。つまり、ID値です。そして、このIDは一意です。
getId()SessionのセッションID値を取得します。
protected void CreateOrGetSession (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建或获取Session会话对象
HttpSession session = req.getSession();
//判断当前Session会话是否是新创建出来的
boolean isNew = session.isNew();
//获取Session会话的唯一标识 id
String id = session.getId();
resp.getWriter().write("得到的Session它的id是:" + id + "<br/>");
resp.getWriter().write("这个Session是否是新创建的:" + isNew + "<br/>");
}
<a href="http://localhost:8080/13_cookie_session/sessionServlet?action=CreateOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a>
3.セッションドメインデータへのアクセス
setAttributeメソッド:
/**
* 往 Session 中保存数据
*/
protected void setAttribute (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("已经往 Session 中保存了数据");
}
getAttributeメソッド:
/**
* 获取 Session 域中的数据
*/
protected void getAttribute (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从 Session 中获得的 key1 的数据是:" + attribute);
}
4.セッションライフサイクル制御
public void setMaxInactiveInterval(int interval)
セッションのタイムアウト期間を設定します(秒単位)。指定された期間を超えると、セッションは破棄されます。
値が正の場合、セッションのタイムアウト期間を設定します。
負の数は、タイムアウトしないことを意味します(破棄されない場合、常にメモリスペースを占有するため、ほとんど使用されません)。
public int getMaxInactiveInterval()
セッションのタイムアウト時間を取得します
public void invalidate()
は、現在のセッションをすぐに無効にします
セッションのデフォルトのタイムアウト時間は30分です。
Tomcatサーバーの構成ファイルweb.xml(C:\ Users \ Point.IntelliJIdea2019.3 \ system \ tomcat \ Tomcat_9_0_37_Javaweb_6 \ conf)に
はデフォルトで次の構成があるため、現在のTomcatサーバーでのすべてのセッションタイムアウトは次のようになります。構成済み構成のデフォルトの期間は30分です。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Webプロジェクトのデフォルトのセッションタイムアウト期間を他の期間にしたい場合は、独自のweb.xml構成ファイルで上記と同じ構成を行うことができます。Webプロジェクト内のすべてのSeessionのデフォルトのタイムアウト期間を変更できます。
<!--表示当前 web 工程。创建出来的所有 Session 默认是 20分钟 超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
個々のセッションのタイムアウト期間のみを変更する場合。上記のAPIを使用できます:個々の設定にsetMaxInactiveInterval(int interval)。
session.setMaxInactiveInterval(int interval)は、タイムアウト期間を個別に設定します。
/**
* Session3秒超时销毁
*/
protected void life3 (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = req.getSession();
// 设置当前 Session 三秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write("当前 Session 已经设置为三秒后超时");
}
访问http:// localhost:8080 / 13_cookie_session / session.html:
セッションの作成と取得(ID番号、新しく作成されたかどうか)をクリックした後、セッションをクリックして3秒間タイムアウトして破棄し、すぐにセッションの作成と取得(ID番号、新しく作成されたかどうか)をクリックします)、セッションが新しく作成されたセッションであるかどうかは常にfalseとして表示されますが、3秒間停止した後でもう一度クリックすると、trueになり、セッションのIDも変更されていることがわかります。
これはタイムアウトの概念から始める必要があり
ます。タイムアウトを3秒に設定した後、Sessionオブジェクトにはタイムアウトタイマー(timeout = 3、毎秒-1)があり、timeout = 0の場合、セッションは削除されたためにタイムアウトします。 。
作成要求が連続して繰り返し送信され、最後の要求からの時間間隔が非常に短い(3秒未満)場合、この時点でタイムアウトは3にリセットされ、タイムアウトすることはできません。
セッションタイムアウトとは、2つのクライアント要求間の最大間隔を指します。
セッションをすぐにタイムアウトするように設定します。
/**
* Session 马上被超时
*/
protected void deleteNow (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取 Session 对象
HttpSession session = req.getSession();
// 让 Session 会话马上超时
session.invalidate();
resp.getWriter().write("Session 已经设置为超时(无效)");
}
5.ブラウザとセッション間の接続の技術的な裏話
セッションテクノロジー、根本的な事実は、達成するためのクッキーベースのテクノロジーです。同時に、セッションが明らかにタイムアウトせず、ブラウザを閉じた後にタイムアウトした理由も説明します(作成されたCookie、その存続時間は次のとおりです:Session ===>ブラウザを閉じると、Cookieは消えます===> Cookieの場合、再度リクエストを送信すると、必然的に新しいリクエストが作成されます)
まず、クライアントはCookie情報ではありません。Cookieがない場合、クライアント(ブラウザ)はサーバー(Tomcat)にリクエストを送信し、サーバーはこのAPIをrequest.getSession()を呼び出し、セッションオブジェクトを作成します。サーバーのメモリ(Session1、Session2、Session3 ...)。
ネットワーク要求では、応答は次のとおりです。
彼はCookieを返します。Cookieの名前はJSESSIONIDと呼ばれ、その値はCookieのID値とまったく同じです。
セッションサーバーは、セッションを作成するたびに、Cookieオブジェクトを作成します。このCookieオブジェクトのキーは常にJSESSIONIDであり、値は新しく作成されたセッションのID値です。
このとき、セッションから新しく作成されたid値に応答して、クライアントに返されます。セットCookie:JSESSIONID = 9055D85D3EB8F0922E3D5D56A8E776DE
サーバーは受信したデータを分析し、すぐにCookieオブジェクトを作成します。
Cookieの形式でサーバーへのセッションIDのすべての要求の背後にあるCookieの後。
このAPIでrequest.getSession()を呼び出すと、Cookieのid値が作成されたSessionオブジェクトを(メモリをトラバースするために)見つけて、戻ります。
注:セッションでCookieを削除した場合は、サーバーにリクエストを再度送信してから、新しいSessionオブジェクトを作成してください。サーバーがSessionオブジェクトを作成するたびに、Cookieオブジェクトが作成されます。このCookieオブジェクトのキーは常にJSESSIONIDであり、値は新しく作成されたセッションの値です。
基盤となるテクノロジーインサイダーアイコン: