数日前、私がチェックインシステムに取り組んでいたとき、私は人気のあるセッションの問題に遭遇しました。このプロジェクトは、Maven Management DirectoryのJavawebサイドシステムであるSpring+SpringMVC+MyBatisフレームワークです。セッションのいくつかの問題については、次の分析が行われます。ここでは、セッションライフサイクルの問題に焦点を当てます。他の定義については、説明しません。
まず、セッションのライフサイクルを説明しましょう。
ストレージ:セッションはサーバー側に保存されます。一般に、サーバーメモリに保存されないように(高速アクセスの場合)、ユーザーがサーバーに初めてアクセスするとSessinonが作成されます。 JSP、サーブレット、その他のプログラムにアクセスするときにのみセッションが作成されることに注意する必要があります。 HTMLや画像などの静的リソースのみにアクセスしても、セッションは作成されません。 Javawebアプリケーションでは、 request.getSession(boolean xxx)を呼び出してセッションを生成できます。ブールパラメーターが真の場合、ここで新しいセッションが生成されることを余儀なくされることに注意してください。
1.セッションの有効期間:
セッションが最後に使用された後、セッションは期限切れになります。
2。別のメソッドsession.invalidate()が実行され、セッションが無効になります。
無効な時間の場合、web.xmlでプロパティを構成することで定義できます。
<session-config> <session-timeout>有効期限</session-timeout> </session-config>
故障時間の単位は分です。セッションが1日間有効な場合、60*24に設定できます。 0またはネガティブに設定すると、セッションは永久に有効です。故障時間の定義によれば、この状況を理解するのは簡単です。
ブラウザが閉じた後、なぜセッションが失敗するのですか?
既知のことに基づいて、簡単な例が書かれました。
@controllerpublic class sessiontest {@requestmapping( "/sessionTest")public string sessionTest(httpservletrequest request、httpservletresponse response){system.out.println( "success!"); httpsession session = request.getSession(); SESSION.SETMAXINACTIVEINTERVAL(259200); request.setAttribute( "CreationTime"、session.getCreationTime(); // creation time request.setAttribute( "id"、session.getid()); // id request.setattribute( "max"、session.getmaxinactiveinterval(-1); //最大障害時間request.setAttribute( "lasttime"、session.getLastaccessedTime()); // last usage time request.setattribute( "sessiontest"、session); // System.out.getCreationTionime()); System.out.println(session.getLastaccessedTime()); 「ページ/ショーセッション」を返します。 } <Table CellPacing = "0" cellPadding = "0"> <tr> <td>作成時間:</td> <td> $ {creationtime} </td> </tr> <tr> <td> id:</td> <td> $ {id} </td> </tr <td> <td> <td> survival時間:</td> <td> $ {max} </td> </tr> <tr> <td>前回使用:</td> <td> $ {lasttime} </td> </tr> <tr> <td>セッション:</td> <td> $ {sessiontest} </td> </tr </table>分析:
セッションの無効な時間は、実際にブラウザが閉じられているときであることがわかります。そのため、ブラウザが閉じていない場合にのみ、ログイン状態を引き続き使用できます。上記で設定した無効化時間は何を表していますか?
ブラウザとサーバーの間にセッションが作成されました。クライアントは長い間サーバーと対話しなかったため(冬眠時間)、サーバーはこのセッションを破壊しました。クライアントがサーバーと対話した前のセッションは再び存在しませんでした。私の理解では、無効化時間はセッション中にのみ有効になります。ブラウザが閉じてセッションが終了すると、無効な時間が永続的に有効に設定されています。これは、ブラウザが閉じてセッションが閉じられる瞬間です。この問題を解決するために、Cookieとセッションを混ぜることができます。そのような愚かな方法があります:
保存ディレクトリとサバイバル時間を設定するために積極的にCookieを追加します
public static void addcookie(文字列名、文字列値、int age、httpservletresponse応答)throws unsupportedencodingception {cookie c = new cookie(name、urlencoder.encode(value、 "utf-8")); C.SetMaxage(age); C.SetPath(PATH); Response.AddCookie(c); }もう一度アクセスするときは、 Cookie[] cookies = request.getCookies(); Cookieを横断するには、Cookieの名前に応じて目的のCookieを取得するか、セッションと言われます。最後に、希望する結果が得られ、セッション(JSessionIDという名前のCookie)はブラウザの投獄から逃げます。
要約します
上記は、ブラウザーが閉じた後のJ2EEセッション障害の問題の解決策です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!