当前位置: 首页 > 知识库问答 >
问题:

有时,Vaadin在“会话超时”消息后不会使会话无效

傅边浩
2023-03-14

在我的Vaadin应用程序中,当Vaadin在“session Timeout”消息之后没有使会话无效时,我遇到了一个问题。收到此消息后,用户有时可以单击链接或刷新页面,并继续工作,就像他们仍在登录一样。我使用以下参数:

closeIdleSessions=true
heartbeatInterval=60
session-timeout=15

Last参数(session-timeout)也在context.xml(session-timeout=900)和web.xml(session-config/session-timeout=15)中设置。

有没有人面对这个挂名的问题?

更新1:固定参数段。

更新2:SessionDestroyListener.SessionDestroy在出现SessionExpired消息时不会触发。

更新3:上一个错误出现是因为代码错误。现在调用了SessionDestroyListener.SessionDestroy,但我没有从给定事件访问HttpSession的权限。

private static class SynchronizerSessionDestroyListener implements SessionDestroyListener {
    @Override
    public void sessionDestroy(SessionDestroyEvent event) {
        if (event.getSession() != null){
            WrappedSession wrappedSession = event.getSession().getSession();
            if (wrappedSession instanceof WrappedHttpSession){
                WrappedHttpSession wrappedHttpSession = (WrappedHttpSession) wrappedSession;
                HttpSession httpSession = wrappedHttpSession.getHttpSession();
                if (httpSession != null){
                    try {
                        httpSession.invalidate();
                        logger.debug("Session '{}' was invalidated", httpSession.getId());
                    } catch (IllegalStateException e){
                        // do nothing, already invalidated
                        logger.debug("Session '{}' was already invalidated: {}", httpSession.getId(), e.getMessage());
                    }
                } else {
                    logger.warn("Could not invalidate http session for vaadin session: http session is null"); // THIS IS THE BRANCH WHICH IS ACTUALLY GET EXECUTED ON 'SESSION EXPIRED' MESSAGE: event.getSession().getSession() is null!
                }
            } else {
                logger.warn("Could not invalidate http session for vaadin session: event session is not an http session");
            }
        } else {
            logger.warn("Could not invalidate http session for vaadin session: event session is null");
        }
    }
}

下面是我附加侦听器的方式:

public class X extends VaadinServlet {
    // different class members
    @Override
    protected void servletInitialized() throws ServletException {
        super.servletInitialized();
        getService().addSessionDestroyListener(new SynchronizerSessionDestroyListener());
    }
}

共有1个答案

昝阳嘉
2023-03-14

我将尝试解释会话无效化基本上是如何工作的,也许这会有所帮助(我无法从您的问题中读出太多信息):

>

  • 通常会话会在session-timeout参数中指定的时间之后超时。
  • 但您必须考虑心跳间隔。如果您的心跳间隔短于会话超时(通常是这样),则心跳将使会话永远保持活动状态。

    这就是参数closeidlesessions相关的地方。将此参数设置为true浏览器将不会将心跳作为超时的有效请求,而是作为最后一个非心跳请求

    <context-param>
     <!-- ATTENTION: This value is set in SECONDS -->
     <param-name>heartbeatInterval</param-name>
     <param-value>180</param-value>
    </context-param>
    
    <session-config>
      <!-- ATTENTION: This value is set in MINUTES -->
      <session-timeout>4</session-timeout>
    </session-config>
    
    <servlet>
        <servlet-name>VaadinServlet</servlet-name>
        <servlet-class>com.example.VaadinServlet</servlet-class>
        <init-param>
          <param-name>closeIdleSessions</param-name>
          <param-value>true</param-value>
        </init-param>
    </servlet>
    

    使用上面的web.xml,会话将在6分钟后超时(没有用户交互)。

    说明:
    会话超时设置为4分钟,但4分钟时没有心跳。下一次心跳将在6分钟。现在客户端引擎知道会话实际上超时了,并将显示相应的消息。

    我不确定当使用Vaadin Push时,这是否是相同的过程,因为在那里,我们有一个从客户端到服务器的连续通道。

  •  类似资料:
    • 我有一个问题发生在我坐在空闲的时候,没有接触网络浏览器,vaadin在点击vaadin应用程序中的任何内容之后,就会抛出红色的通信问题错误消息。 我已经通过30分钟不接触浏览器进行了测试。之后,当我单击vaadin应用程序中的一个按钮时,它会抛出通信错误消息。 我有两个应用服务器,它们位于Rackspace的负载均衡器后面。我还启用了“粘性会话”... vaadin可能有自己的超时吗?

    • 我正在开发一个vaadin web应用程序,我在web.xml中添加了以下代码片段。 现在我注意到,也在30分钟后,我的用户能够使用应用程序,我不想这样。我在vaadin的书上读到了一些关于这个问题的东西,但我并不了解一些东西。 在web.xml中: 会话超时应长于心跳间隔,否则会话在心跳保持活动之前就已关闭。由于会话过期使UI处于假定会话仍然存在的状态,这将在浏览器中导致不同步错误通知。 但是,

    • 在 HTTP 协议中,当客户端不再处于活动状态时没有显示的终止信号。这意味着当客户端不再处于活跃状态时可以使用的唯一机制是超时时间。 Servlet 容器定义了默认的会话超时时间,且可以通过 HttpSession 接口的 getMaxInactiveInterval 方法获取。开发人员可以使用HttpSession 接口的 setMaxInactiveInterval 方法改变超时时间。这些方法

    • 有什么想法吗?

    • 问题内容: 我在用户登录时创建会话,如下所示: 如何在X分钟的会话上指定超时,然后在达到X分钟后让它执行功能或页面重定向? 编辑:我忘了提及由于不活动,我需要会话超时。 问题答案: 首先,存储用户最后一次发出请求的时间 在后续请求中,检查他们多久之前提出了请求(在此示例中为10分钟)

    • Vaadin7会话超时有几个问题。首先,即使我尝试将heartbeatinterval更改为20秒,Vaadin debug仍然说它是默认值300秒。 另一个问题是,除了通信错误消息之外,我根本无法获得会话超时消息。无论会话是1分钟还是2分钟,或者比heartbeatinterval更长的时间都无关紧要。 第三个问题是,在通信错误消息中总是有“无效的JSON-response from serve