应用程序中旧的“删除/无效”Cookie

时间:2014-01-17 18:41:31

标签: java tomcat cookies jboss

Hy Guys。

我在这里读了许多关于在请求上使cookie失效并将其添加到响应中的问题(我知道它不能被物理删除)。

我读过How do you remove...Cookie,这是我最接近我的问题。没有任何答案和建议对我的具体案例有所帮助(我认为)。

我正在我的机器上测试它,所以我的域名是我的工作域。我有一个配置了tomcat服务器的eclipse和另一个配置了JBoss服务器的eclipse。

所以,我的情况是我已经建立了一个单点登录系统,我有一个域名是单一登录系统(例如:myMachine.myCompany.com:8081/login让它命名为登录)我有一个使用此登录的系统,它将在另一个地址,现在一切都在我的机器上,所以这个其他系统(myMachine.myCompany.com:8080/system/something/index.jsf让它命名为 app < / em>的)

我的实施工作流程是:

- 用户从jboss中访问应用 - 转到 securityFilter ,检查请求中的所有内容(web.xml上的/*)到此应用程序
- 安全过滤器检查用户是否有cookie(jboss side)

Cookie[] cookies = request.getCookies();
if(cookies != null){ 
    for (Cookie cookie : cookies) {
        if (cookie.getName().equalsIgnoreCase("ssoSecurity")) {
            return cookie;
        }
    }
}

- 如果用户没有cookie我将其重定向到登录(tomcat) - 当用户登录(输入要在数据库上检查的数据)时,我使用令牌为该用户创建一个会话,以便稍后(在需要时)识别tomcat服务器上的cookie:

Cookie cookie = new Cookie("ssoSecurity", token);
cookie.setDomain(domain); //.myCompany.com
cookie.setVersion(0);
cookie.setPath("/");
cookie.setSecure(request.isSecure());
cookie.setMaxAge(-1); //deleted when the browser close
response.addCookie( cookie );

- 然后登录将用户重定向到应用,它将再次出现在securityFilter上 - 在 securityFilter 检查cookie并找到它之后,它获取其值(令牌)并调用我的securityClient(我的类路径上的JAR通过json返回的休息来与tomcat通信)来检查如果用户已进入(仅在第一次在此服务器上创建用户会话) - 然后它正常运行应用程序

我的问题是注销功能无法正常工作。我会解释一下。

应用上,用户点击将注销(#{appUserBean.logout})我的注销方法的注销链接:

HttpServletResponse response = (HttpServletResponse)FacesContext
              .getCurrentInstance().getExternalContext()
              .getResponse();
HttpServletRequest request = (HttpServletRequest)FacesContext
              .getCurrentInstance().getExternalContext()
              .getRequest();
destroyCookie(getCookie(request), response);
SSOClient client = new SSOClient(); //from the jar that I mentioned
client.logout(this.getUserSession().getToken(), request, response);

destroyCookie方法:

private void destroyCookie(Cookie cookie, HttpServletResponse response) {
    if (cookie != null) {
        response.setContentType("text/html");
        cookie.setPath("/");
        cookie.setValue("notValidSession");
        cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
        cookie.setVersion(0);
        cookie.setDomain(""); //I've tried ".myCompany.com" wont work
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }
}

这一行:client.logout(this.getUserSession().getToken(), request, response);会将令牌发送到登录应用程序,以便从登录服务器(tomcat)中注销用户,然后将用户重定向到登录应用程序(tomcat)

案例是Cookie未被无效,其值也在变化。因此,如果我不关闭浏览器并为应用设置链接cookie仍然在那里,用户令牌没有我设置的新值(“notValidSession”)并且在tomcat服务器上如果我检查request.getCookies();它就像没有cookie一样为空,但我可以在那里看到cookie在firefox或chrome资源上并具有相同的值(用户令牌)。

我刚刚在写这篇文章的时候意识到,我并没有在jboss方面使用户会话无效(我会这样做,而你们可以提出一些或者你能找到的任何错误)。

提前致谢,

1 个答案:

答案 0 :(得分:0)

事实证明问题出现在destroyCookie这个方法的cookie.setDomain("");上,正如我所说的那样,我已经尝试设置我的Cookie域,但是因为我做了很多更改使用setDomain(".myCompany.com")无效。

现在我修改了我的client.logout以清除jboss端用户的会话信息并进行了修改,在destroyCookie方法上设置了域,它运行正常。所以最后的修改是这样的:

private void destroyCookie(Cookie cookie, HttpServletResponse response) {
    if (cookie != null) {
        response.setContentType("text/html");
        cookie.setPath("/");
        cookie.setValue("notValidSession");
        cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
        cookie.setVersion(0);
        //I've configured the domain on the custom-params-service.xml on JBoss
        cookie.setDomain( AppUtils.getJndiConfig("SSOCookieDomain") ); 
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }
}

在JBoss端(在我的客户端jar上)清理会话信息的方法:

private void cleanUserSession(HttpServletRequest _request) {
    HttpSession session = (HttpSession) _request.getSession(false);
    if ( session != null ){
        session.setAttribute(ClientUtil.AUTH_TOKEN, "" );
        session.setAttribute(ClientUtil.USUER_INFO, null);
    }
}