【问题标题】:How to get all sessions in Vaadin如何在 Vaadin 中获取所有会话
【发布时间】:2014-09-19 15:59:21
【问题描述】:

我想知道有多少用户实时连接到我的应用程序。我有想法循环打开的会话数,但我找不到如何做到这一点。如果您有其他方法可以做到这一点,欢迎您提出建议。

【问题讨论】:

    标签: java session vaadin


    【解决方案1】:

    目前我发现的最佳解决方案是在创建和销毁会话时对其进行计数。

    public class VaadinSessionListener{
    
        private static volatile int activeSessions = 0;
    
        public static class VaadinSessionInitListener implements SessionInitListener{
    
            @Override
            public void sessionInit(SessionInitEvent event) throws ServiceException {
    
                incSessionCounter();            
            }
        }
    
        public static class VaadinSessionDestroyListener implements SessionDestroyListener{
    
            @Override
            public void sessionDestroy(SessionDestroyEvent event) {
    
                /*
                 * check if HTTP Session is closing
                 */
                if(event.getSession() != null && event.getSession().getSession() != null){
    
                    decSessionCounter();
                }
            }
        }
    
    
        public static Integer getActiveSessions() {
            return activeSessions;
        }
    
        private synchronized static void decSessionCounter(){
            if(activeSessions > 0){
                activeSessions--;
            }
        }
    
        private synchronized static void incSessionCounter(){
            activeSessions++;
        }
    }
    

    然后在 VaadinServlet init() 方法中添加 SessionListeners

    @WebServlet(urlPatterns = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = true, ui = MyUI.class)
    public static class Servlet extends VaadinServlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
            super.init(servletConfig);
    
    
            /*
             * Vaadin SessionListener
             */
            getService().addSessionInitListener(new VaadinSessionListener.VaadinSessionInitListener());
            getService().addSessionDestroyListener(new VaadinSessionListener.VaadinSessionDestroyListener());    
        }
    }
    

    【讨论】:

    • 没用!我将Servlet 类添加到我的UI 中,但它不会增加计数器。我还有什么需要改变的吗?
    • Servlet 类应该已经在 UI 中可用。您使用的是哪个 vaadin 版本和 servlet 版本?
    • 带有 Maven 的 Vaadin 7.2。我在 Web.xml 中使用com.vaadin.server.VaadinServlet
    • 我的代码示例适用于 Servlet 3.0 规范。您可能还必须在 web.xml 中添加正确的 Servlet。 web.xml 中的 com.vaadin.server.VaadinServlet 错误。
    • 当我将Servlet 放在另一个java 类中并在我的web.xml 中更改Servlet 位置时,它起作用了。谢谢伙计,这个主意很好。
    【解决方案2】:

    [撤回]

    这是一个错误的答案。我错误地认为引用的方法回答了问题,但事实并非如此。 将此视为撤回;而不是删除这个答案,我会留下它,以免其他人犯我的错误。


    VaadinSession.getAllSessions()

    Vaadin 7.2 添加了一个静态方法,VaadinSession.getAllSessions。有关历史,请参阅Ticket # 13053

    该方法返回附加到单个 HttpSessionVaadinSession 对象中的 Collection

    此方法告诉您单个用户的 HttpSession 运行了多少 VaadinSession 对象,但告诉您 Vaadin 应用服务器上有多少总用户。

    【讨论】:

    • 这将返回给定 http 会话的 vaadin 会话。为了实现所要求的,需要按照此处所述收集 http 会话:stackoverflow.com/questions/10770535/… 或使用 Vaadin SessionInitListener
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多