我需要为用户提供一个Web界面来更改会话超时间隔。因此,Web应用程序的不同安装可以为其会话设置不同的超时,但它们的web.xml
不能有所不同。
有没有办法以编程方式设置会话超时,以便我可以使用ServletContextListener.contextInitialized()
来读取配置的时间间隔并在应用程序启动时设置它?
非常感谢。
答案 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
值(从而在服务器级别配置它)〜或〜HttpSession. setMaxInactiveInterval(int seconds)
方法以编程方式。 但请注意,后一个选项设置当前会话的超时值,这不是全局设置。
答案 2 :(得分:1)
正如另一个说话者所说,你可以改变一个会话监听器。但是,您可以直接在servlet中更改它,例如。
getRequest().getSession().setMaxInactiveInterval(123);
答案 3 :(得分:0)
我需要给我的用户一个Web界面来更改会话超时间隔。因此,Web应用程序的不同安装对其会话可以具有不同的超时,但是它们的web.xml不能相同。
您的问题很简单,您需要在运行时配置会话超时间隔,并且应该通过Web界面进行配置,并且不应该有重启服务器的开销。
我正在扩展迈克尔斯的答案以解决您的问题。
逻辑:您需要将配置的值存储在.properties文件或数据库中。在服务器启动时,读取该存储的值并使用该变量复制到变量,直到服务器启动。由于config是更新的,更新变量也是如此。 就是这样。
在MyHttpSessionListener类中 1.创建一个名称为globalSessionTimeoutInterval的静态变量。
创建一个静态块(仅在第一次访问类时执行),并从config.properties文件中读取超时值,并将其值设置为globalSessionTimeoutInterval变量。
现在使用该值设置maxInactiveInterval
现在的Web部件,即“管理员配置”页面
a。将配置的值复制到静态变量globalSessionTimeoutInterval。
b。将相同的值写入config.properties文件。 (考虑重新启动服务器,然后将使用config.properties文件中存在的值加载globalSessionTimeoutInterval)
备用.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
}