如何在Java Web应用程序中动态设置会话超时?

时间:2010-06-02 19:04:12

标签: java session servlets timeout

我需要为用户提供一个Web界面来更改会话超时间隔。因此,Web应用程序的不同安装可以为其会话设置不同的超时,但它们的web.xml不能有所不同。

有没有办法以编程方式设置会话超时,以便我可以使用ServletContextListener.contextInitialized()来读取配置的时间间隔并在应用程序启动时设置它?

非常感谢。

4 个答案:

答案 0 :(得分:66)

使用HttpSessionListener而不是使用ServletContextListener。在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>

不过,我建议为每个应用程序创建不同的web.xml文件,并在那里定义会话超时:

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

答案 1 :(得分:32)

  

有没有办法以编程方式设置会话超时

基本上有三种方法来设置会话超时值:

  • 使用标准session-timeout文件中的web.xml〜或〜
  • 在缺少此元素的情况下,通过获取服务器的默认session-timeout值(从而在服务器级别配置它)〜或〜
  • 使用Servlet或JSP中的HttpSession. setMaxInactiveInterval(int seconds)方法以编程方式。

但请注意,后一个选项设置当前会话的超时值,这不是全局设置。

答案 2 :(得分:1)

正如另一个说话者所说,你可以改变一个会话监听器。但是,您可以直接在servlet中更改它,例如。

getRequest().getSession().setMaxInactiveInterval(123);

答案 3 :(得分:0)

我需要给我的用户一个Web界面来更改会话超时间隔。因此,Web应用程序的不同安装对其会话可以具有不同的超时,但是它们的web.xml不能相同。

您的问题很简单,您需要在运行时配置会话超时间隔,并且应该通过Web界面进行配置,并且不应该有重启服务器的开销。

我正在扩展迈克尔斯的答案以解决您的问题。

逻辑:您需要将配置的值存储在.properties文件或数据库中。在服务器启动时,读取该存储的值并使用该变量复制到变量,直到服务器启动。由于config是更新的,更新变量也是如此。 就是这样。

经验

在MyHttpSessionListener类中 1.创建一个名称为globalSessionTimeoutInterval的静态变量。

  1. 创建一个静态块(仅在第一次访问类时执行),并从config.properties文件中读取超时值,并将其值设置为globalSessionTimeoutInterval变量。

  2. 现在使用该值设置maxInactiveInterval

  3. 现在的Web部件,即“管理员配置”页面

    a。将配置的值复制到静态变量globalSessionTimeoutInterval。

    b。将相同的值写入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
}