1

このフォーラムは初めてです。私はJSPサーブレットアプリケーションを設計し、セッション変数を使用してオブジェクトを格納しています。問題は、セッション変数に2回アクセスすると、nullが返されることです。これが私のアプリの流れです-

複数のリンクボタンがあるjspページがあります。ユーザーがいずれかのボタンをクリックすると、サーブレットがそれぞれのパラメーターで呼び出されます。たとえば、button1がクリックされた場合は1が渡され、button2がクリックされた場合は2が渡されます。

サーブレットは、以前に作成されたセッション変数からarraylistを取得し、要求されたパラメータに応じてarraylistからデータを取得し、それを処理して、別のjsp、たとえばjsp2に応答を送信します。

jsp2にも同様のリンクボタンがあり、同じタスクを実行する必要があります。同じサーブレットがjsp2から呼び出された場合、またはページが更新された場合でも、今回はセッション変数がnullになります。

session-configタグの下のweb.xmlファイルで、セッションが期限切れにならないようにタイムアウトを-1に設定しました。

<session-config>
      <session-timeout>-1</session-timeout> 
   </session-config>

サーブレットでは、セッション変数を次のように取得します-

HttpSession session = request.getSession(false);

ArrayList<String> list = new ArrayList<String>();
list = (ArrayList<String>)session.getAttribute("mylist");

サーブレットが2回呼び出されたとき、またはページが更新された場合でも、リストはnullになります。セッションが有効かどうかを確認するために数行を入力しました。2回目に印刷されます。

if(!request.isRequestedSessionIdValid()) {
 System.out.println("Session is Expired !!");
}

session.getAttribute("mylist")戻りますNullPointerException

session.invalidate()たまたまセッションを終了するためにどこにも使用したことはないと確信しています。何が悪いのかわかりません。誰かが私を説明できますか?

よろしくお願いします。

4

4 に答える 4

2

getSession(true)初めてまたは で試す必要がありますgetSession()。セッションが存在しない場合、False 引数はセッションを返しません。getSession呼び出しに true を指定する必要があるのは、初めての場合だけです。

HttpSession session = request.getSession(true);

サーブレット仕様によると、

HttpSession getSession(boolean create)

このリクエストに関連付けられた現在の HttpSession を返します。現在のセッションがなく、create が true の場合は、新しいセッションを返します。

create が false で、リクエストに有効な HttpSession がない場合、このメソッドは null を返します。

セッションが適切に維持されるようにするには、応答がコミットされる前にこのメソッドを呼び出す必要があります。コンテナーがセッションの整合性を維持するために Cookie を使用しており、応答がコミットされたときに新しいセッションを作成するように求められた場合、IllegalStateException がスローされます。

編集 - セッション ID からのセッション

 HttpSessionContext sc=request.getSession().getSessionContext();
    HttpSession session=sc.getSession(session_id);

注 - このメソッドは、セキュリティ上の理由から廃止されました。

于 2012-10-18T15:33:42.640 に答える
1

応答を他の JSP ページに送信してみて、そこからセッション変数にアクセスできるかどうかを確認してください。はいの場合、現在の jsp に問題があります。確かに、セッションは確実にどこかで期限切れになっています。それ以外の場合、request.getSession() は以前に作成されたセッションを確実に返します。

于 2012-10-18T18:19:49.517 に答える
0

無制限のセッション時間が必要な場合0ではなく、タイムアウトを に設定します。-1

于 2012-10-18T14:29:48.563 に答える
0

取得する前に、属性をどこかに設定する必要があります。

session.setAttribute("mylist", list);
于 2012-10-18T14:33:42.277 に答える