繁体   English   中英

如何在重定向Apache2 AJP负载平衡Tomcat中删除会话ID

[英]How to remove a session ID in a redirect Apache2 AJP load balancing Tomcats

好的,首先我们有一个在Tomcat节点上运行的Java Servlet应用程序。 在此之前,我们有使用ajp连接器进行负载平衡的Apache2。

通常,我们会滚动更新错误修复程序。 这需要使用Apache Jk Status Manager禁用节点并将所有新流量重定向到活动节点。 这使用户可以保留在旧节点上,直到他们注销为止。 漫长的等待后,我通常可以停止已禁用的节点并移入更新。然后激活该节点并禁用其他节点。

我要解决的问题是防止不活动的用户在会话结束后重新连接到禁用的节点。 在文档中有对此问题的引用。

关于将激活设置为禁用的最后说明:请求附带的会话ID是作为请求URL(; jsessionid = ...)的一部分或通过cookie发送的。 当使用已久运行的书签或浏览器时,可以发送带有旧的无效会话ID的请求,该ID指向禁用的成员。 由于负载平衡器没有有效会话的列表,它将把请求转发给禁用的成员。 因此,排空花费的时间比预期的长。 要处理这种情况,您可以在Web应用程序中添加一个Servlet过滤器,以检查请求属性JK_LB_ACTIVATION。 此属性包含字符串“ ACT”,“ DIS”或“ STP”之一。 如果您检测到“ DIS”并且该请求的会话不再处于活动状态,则删除会话cookie并使用自引用URL进行重定向。 然后,重定向的请求将不再携带会话信息,因此负载平衡器不会将其发送给禁用的工作程序。 请求属性JK_LB_ACTIVATION已在1.2.32版中添加。

我的问题是关于黑体字的 如何防止在重定向中发送JSESSION ID。

我现在正在使用的代码最终以无限重定向循环结束。

       public final void doGet(HttpServletRequest req, HttpServletResponse res)
                    throws IOException, ServletException
            {
        ...
            String status = (String)req.getAttribute("JK_LB_ACTIVATION");
                         log.info("Node status " + status);
                         if("DIS".equals(status)) {
                            log.info("Status disabled, looking for session ");
                            Collection<HttpSession> col = TurbineSession.getActiveSessions();
                            Iterator<HttpSession> it = col.iterator();
                            boolean found = false;
                            String requestSession = req.getRequestedSessionId();
                            sessionSearch: while(it.hasNext()) {
                                HttpSession session = (HttpSession) it.next();
                                log.info("Comparing " + requestSession + " to " + session.getId());
                                if(session.getId().equals(requestSession)) {
                                    found = true;
                                    break sessionSearch;
                                }
                            }
                            if(!found) {
                                String path = "mypath";
                    Cookie[] cookies = req.getCookies();
                    for(Cookie tempCookie : cookies) {
                        if(requestSession.equals(tempCookie.getValue())) {
//                          tempCookie.setValue(null);
                            tempCookie.setMaxAge(0);
//                          tempCookie.setPath(path);
                            res.addCookie(tempCookie);
                        }
                    }
                    res.sendRedirect(path);
                    return;
                            }
                         }
    ...
    }

使用Firebug检查重定向显示JSESSIONID仍包含在重定向中。 如何删除它? 我看到的所有关于删除Cookie的信息似乎都无效。

如何在Java Servlet中删除Cookie

新增中

tempCookie.setPath("/");

而不是使用完整的路径或最终将其遗漏了(似乎可以做到)。 我敢肯定有一些深奥的解释。

如报价中所述。 URL中有; jsessionid =或请求中的Cookie:标头。

我不知道您为什么要进行会话搜索。 您只需要测试session.isValid()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM