web-dev-qa-db-ja.com

web.xmlのセッションタイムアウト

セッションタイムアウトのためのWeb.xmlでのセッション構成の本当の目的を理解しようとしています。

<!-- Session Configuration -->
<session-config>
        <session-timeout>60</session-timeout>
</session-config>

では、私の質問についてお話ししましょう。

私のアプリケーションは.txtファイルをインポート/アップロードしていますが、インポートするレコードの数は数百万あるため、1時間以上かかることがあります。しかし、私のアプリケーションは進行中の.txtファイルをまだインポートしていますが、セッションは1時間後にタイムアウトします。このようなアプリケーションは、アプリケーションがバックグラウンドで何らかのタスクを実行しているため、タイムアウトになりません。

62
Vineet

有効期限が切れないセッションタイムアウトを設定することは望ましくありません。ユーザーが終了するたびにログアウトボタンを押して、サーバーの負荷が過剰になるのを防ぐためです(ユーザーとハードウェアの量によって異なります)。さらに、回避したい場合に遭遇する可能性のあるセキュリティの問題がいくつかあります。

サーバーがまだタスクを処理している間にセッションが無効になる理由は、クライアント側(ユーザーブラウザー)とサーバー側の間で通信が行われないためです。 http-request。したがって、サーバーはユーザーの状態を知ることができず、ユーザーがアイドル状態にあると判断し、web.xmlに設定された時間が経過するとセッションを無効にします。

これを回避するには、いくつかの可能性があります。

  • タスクが実行されている間にバックエンドをpingして、セッションにアクセスし、有効期限が切れないようにすることができます
  • サーバー内の<session-timeout>を増やしますが、これはお勧めしません
  • 作業中にセッションに触れる(拡張する)専用のスレッドでタスクを実行するか、スレッドが終了したときにユーザーに通知する

同様の質問がありました。おそらく、このソリューションの一部をプロジェクトに適応させることができます。 this をご覧ください。

これがお役に立てば幸いです!

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

セッションの有効期限が切れない場合は「-1」を使用できます。スレッドが完了するまでにどれくらいの時間がかかるかわからないので。

36
user1262479

ファイルのアップロードが完了するまでサーバーとのセッションを維持するために、AJAX Http要求をjavascriptを介してサーバーに定期的に(60秒ごとに1回など)送信します。

9
user2039408

ハッキーな方法:

大規模なアップ/ダウンロードが予想される場合、プログラムでセッションタイムアウトを増やすことができます。

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS)

プロセスが終了したら、タイムアウトをデフォルトに戻すことができます。

しかし.. Java EEを使用していて、アップ/ダウンロードに1時間もかからない場合、より良い方法は(JMSなどを介して)タスクを非同期で実行することでした。

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

上記のコードでは"60" stands for the minutes.セッションは60 minutes.の後に期限切れになります。説明されている-1の例では、セッションが期限切れになることはありません。

ドキュメントは言います:

Session-timeout要素は、このWebアプリケーションで作成されたすべてのセッションのデフォルトのセッションタイムアウト間隔を定義します。指定されたタイムアウトは、整数分で表現する必要があります。タイムアウトが0以下の場合、コンテナはセッションのデフォルトの動作がタイムアウトにならないようにします。この要素が指定されていない場合、コンテナはデフォルトのタイムアウト期間を設定する必要があります。

6
Rubens Mariuzzo

質問に対する答えとして多くのオプションを見ることができますが、セッションの有効期限が切れない場合は「-1」を使用できます。スレッドが完了するまでにどれくらいの時間がかかるかわからないので。例えば。:

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

または、何らかの目的でタイムアウトが発生したくない場合:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

別のオプションは、数を1000などに増やすことなどです。bla、bla、bla。

ただし、本当に停止する必要があり、アプリケーションでユーザーに強制的にログアウトさせる必要がないと考える場合は、ログアウトボタンを追加するだけで、ユーザーはいつ退出するかを決定します。

強制的にログアウトする必要がなく、サーバーに時間ベースがかかり、コンピューターの速度とファイルのサイズがかかるファイルをロードしている場合、問題を解決するためにできることは次のとおりです。

<!-- sets the default session timeout to 60 minutes. -->
   <!-- <session-config>
     <session-timeout>60</session-timeout>
   </session-config> -->

コメントするか削除するだけです!タン・タランタン、タン・タン!

5
S. Mayol

この問題に対して2つの方法で時間を宣言できます。

1)ファイルの読み取りが完了するまでの時間が長すぎる。

<session-config>
    <session-timeout> 1000 </session-timeout>
</session-config>

2)セッションが期限切れにならない時間を宣言します。

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

私がお勧めする別のオプションは、大きなファイルを使用するステートレスな別のアプリケーションを作成することです。メインアプリで新しいウィンドウまたはiframeを開き、ファイルを受け入れてそのウィンドウから送信し、Javascriptを使用してアップロードが開始されたらウィンドウまたはiframeを非表示にします。

1

大きなファイルをチャンクに分割し、一度に複数のファイルを処理するためにマルチスレッド機能に依存することを検討する必要がありますORファイルまたはレコードの処理時間を知ることができる場合、プログレスバーを含むブラウザから表示できます。

0
Prashant

何らかの目的でタイムアウトが発生したくない場合:

<session-config>
    <session-timeout>0</session-timeout>
</session-config>

結果としてタイムアウトは発生しません->無限

0
Jeevan Patil