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方面使用户会话无效(我会这样做,而你们可以提出一些或者你能找到的任何错误)。
提前致谢,
答案 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);
}
}