Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除重定向Apache2 AJP负载平衡Tomcats中的会话ID_Java_Servlets_Apache2_Load Balancing_Ajp - Fatal编程技术网

Java 如何删除重定向Apache2 AJP负载平衡Tomcats中的会话ID

Java 如何删除重定向Apache2 AJP负载平衡Tomcats中的会话ID,java,servlets,apache2,load-balancing,ajp,Java,Servlets,Apache2,Load Balancing,Ajp,好的,首先我们有一个在Tomcat节点上运行的Javaservlet应用程序。在此之前,我们有Apache2使用ajp连接器进行负载平衡 通常,我们会对错误修复进行滚动更新。这需要使用ApacheJK状态管理器禁用节点并将所有新流量重定向到活动节点。这允许用户在注销之前保持在旧节点上。在长时间等待之后,我通常可以停止禁用的节点并将更新移入。然后激活该节点并禁用其他节点 我想解决的问题是防止非活动用户在会话结束后重新连接到禁用的节点。文档中提到了这个问题 关于将激活设置为禁用的最后一个注意事项:请

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

通常,我们会对错误修复进行滚动更新。这需要使用ApacheJK状态管理器禁用节点并将所有新流量重定向到活动节点。这允许用户在注销之前保持在旧节点上。在长时间等待之后,我通常可以停止禁用的节点并将更新移入。然后激活该节点并禁用其他节点

我想解决的问题是防止非活动用户在会话结束后重新连接到禁用的节点。文档中提到了这个问题

关于将激活设置为禁用的最后一个注意事项:请求附带的会话id作为请求URL的一部分发送;JSSessionID=。。。或者通过饼干。当使用已运行很长时间的书签或浏览器时,可能会发送带有指向禁用成员的旧的无效会话id的请求。由于负载平衡器没有有效会话的列表,它会将请求转发给被禁用的成员。因此,排水所需的时间比预期的要长。为了处理这种情况,您可以向web应用程序添加一个Servlet过滤器,该过滤器检查请求属性JK_LB_ACTIVATION。此属性包含ACT、DIS或STP字符串之一。如果检测到DIS并且请求的会话不再处于活动状态,请删除会话cookie并使用自引用URL重定向。重定向的请求将不再携带会话信息,因此负载平衡器将不会将其发送给禁用的工作进程。版本1.2.32中添加了请求属性JK_LB_ACTIVATION

我的问题是关于这项大胆的声明。如何防止在重定向中发送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的所有内容似乎都不起作用。

如引用中所述。有两种情况:;URL中的jsessionid=或请求中的Cookie:header

我不知道你为什么要做会话搜索。您只需要测试session.isValid

添加

tempCookie.setPath("/");

而不是使用完整的路径或忽略它最终似乎做到了这一点。我肯定有一些深奥的解释

尝试Cookie Cookie=新CookieJSESSIONID,requestSession;cookie.setMaxAge0;addCookiecookie;似乎不起作用。一个相当于RTFM的答案,不提供任何解决方案或解决方案的方向是毫无用处的。