簡體   English   中英

如何在Java Web應用程序中動態設置會話超時?

[英]How to set session timeout dynamically in Java web applications?

我需要為我的用戶提供一個Web界面來更改會話超時間隔。 因此,Web應用程序的不同安裝可以為其會話設置不同的超時,但是它們的web.xml不能有所不同。

有沒有辦法以編程方式設置會話超時,以便我可以使用ServletContextListener.contextInitialized()來讀取配置的間隔並在應用程序啟動時設置它?

非常感謝。

不使用ServletContextListener,而是使用HttpSessionListener

sessionCreated()方法中,您可以以編程方式設置會話超時

public class MyHttpSessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event){
      event.getSession().setMaxInactiveInterval(15 * 60); // in seconds
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

並且不要忘記在部署描述符中定義偵聽器

<webapp>
...      
  <listener>                                  
    <listener-class>com.example.MyHttpSessionListener</listener-class>
  </listener>
</webapp>

(或者從Servlet 3.0版起,您可以使用@WebListener注釋)。


不過,我建議為每個應用程序創建不同的web.xml文件,並在那里定義會話超時:

<webapp>
...
  <session-config>
    <session-timeout>15</session-timeout> <!-- in minutes -->
  </session-config>
</webapp>

有沒有辦法以編程方式設置會話超時

基本上有三種方法來設置會話超時值:

但請注意,后一個選項設置當前會話的超時值,這不是全局設置。

正如另一個告訴你的那樣,你可以改變一個會話監聽器。 但是,您可以直接在servlet中更改它。

getRequest().getSession().setMaxInactiveInterval(123);
我需要為我的用戶提供一個Web界面來更改會話超時間隔。 因此,Web應用程序的不同安裝可以為其會話設置不同的超時,但是它們的web.xml不能有所不同。

您的問題很簡單,您需要會話超時間隔應該在運行時可配置,配置應該通過Web界面完成,不應該有重啟服務器的開銷。

我正在擴展邁克爾斯的答案來解決你的問題。

邏輯 :您需要將配置的值存儲在.properties文件或數據庫中。 在服務器上啟動讀取該存儲的值並復制到變量使用該變量,直到服務器為UP。 由於config也更新了更新變量。 而已。

Expaination

在MyHttpSessionListener類中1.創建一個名為globalSessionTimeoutInterval的靜態變量。

  1. 創建一個靜態塊(僅在第一次訪問類時執行)並從config.properties文件讀取超時值並將值設置為globalSessionTimeoutInterval變量。

  2. 現在使用該值設置maxInactiveInterval

  3. 現在Web部分即管理員配置頁面

    一個。 將配置的值復制到靜態變量globalSessionTimeoutInterval。

    將相同的值寫入config.properties文件。 (考慮重新啟動服務器,然后將使用config.properties文件中存在的值加載globalSessionTimeoutInterval)

  4. 備用.properties文件或將其存儲到數據庫中。 選擇是你的。

實現相同的邏輯代碼

public class MyHttpSessionListener implements HttpSessionListener 
{
  public static Integer globalSessionTimeoutInterval = null;

  static
  {
      globalSessionTimeoutInterval =  Read value from .properties file or database;
  }
  public void sessionCreated(HttpSessionEvent event)
  {
      event.getSession().setMaxInactiveInterval(globalSessionTimeoutInterval);
  }

  public void sessionDestroyed(HttpSessionEvent event) {}

}

在配置控制器或配置servlet中

String valueReceived = request.getParameter(timeoutValue);
if(valueReceived  != null)
{
    MyHttpSessionListener.globalSessionTimeoutInterval = Integer.parseInt(timeoutValue);
          //Store valueReceived to config.properties file or database
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM