为长期请求保持会话活动

时间:2014-07-11 06:19:52

标签: java-ee jax-rs keep-alive httpsession

让我解释一下背景,我们已经在Java EE中构建了它在weblogic服务器中部署的应用程序。该应用程序部署为耳朵,这包含2场战争,UI模块战争和JAX-RS服务器战争。 UI模块war将请求发送到JAX-RS服务器war并在浏览器中显示数据。

现在我们请求调用导出数据,用户可以在其中导出批量数据,这需要更长的时间,如小时。我们希望用户在导出请求运行时登录。

weblogic 10.3.6

我知道我们可以像

那样配置会话
<session-config><session-timeout>-1</session-timeout></session-config>

问题:如何长时间保持用户会话运行请求? 更新:我正在寻找特定于导出请求的配置,其他请求应继续具有较小的会话超时。

如果不清楚,请告诉我?

由于

3 个答案:

答案 0 :(得分:1)

你不需要SessionListener。只需通过请求对象访问会话。你可以尝试这样的事情:

// pseudo code
if(request is exportData) {
   request.getSession().setMaxInactiveInterval(longTime);
}
else {
   // reset to your default value if no long request in progress
}

您可以根据需要将其放入servlet,过滤器或JAX-RS服务中。

请记住,如果同一用户在导出数据时可能会发出其他请求,您应该检测到这一点,而不是重置超时,因为这些请求将共享同一个会话。

答案 1 :(得分:0)

我认为你想为某些特定请求动态设置超时。您可以通过实现HttpSessionListener来实现。

在listner的sessionCreated()方法中,您可以在运行时设置所需的超时,如下所示:

public class SessionListnerImpl implements HttpSessionListener{
    public void sessionCreated(HttpSessionEvent event){
        event.getSession().setMaxInactiveInterval(15*60); //in seconds
    }
    public void sessionDestroyed(HttpSessionEvent event){}
}

答案 2 :(得分:0)

这不是直接的答案,只是需要考虑的事情。

我不确定,允许会话运行很长时间有多好,例如在你的情况下小时。更好的方法是使用用户请求触发长时间运行的作业以导出某些内容并快速返回(快速)作业的ID以便再次查询。当用户再次查询时,您可以在作业完成时提供下载,也可以提供作业的状态。

如果长时间运行会话,会发生什么,

  1. 用户关闭浏览器或用户端崩溃的内容。
  2. 有很多用户阻止了许多会话。