如何在Java Servlet过滤器中检索所有具有相同名称和相同域的cookie?

时间:2018-08-20 12:33:55

标签: java cookies

我有一个Java Web应用程序。我实现了一个具有用户权限的登录系统,前一段时间,该系统具有“记住我”功能,该功能具有在cookie中保存的唯一字符串ID的客户端。

一切正常,除了以下事实之外:每当新会话开始时,“记住我”功能始终在首次页面加载时失败。但是,由于大多数用户首先访问不受限制的页面,因此一直没有抱怨。但是,我想修复它。这是我所学到的。

我使用javax.servlet.Filter的实现来检查用户是否有权访问页面。例如baseURL/pages/admin/*。 Filter接口有一个称为doFilter的方法,该方法接受ServletRequest和ServletResponse对象作为参数。我将它们转换为HttpServletRequest和HttpServletResponse。 HttpServletRequest使我可以访问cookie和会话。

如果我遍历cookie,我会找到我的“记住” -cookie,并将唯一ID作为值。但是,此ID是错误的。

现在,在遵循前端控制器模式的Servlet类中,我还检查了登录的用户,并记住了我。但是由于这是在过滤器之后执行的,因此仅在此处进行检查是不够的。尽管如此,我还是要检查每个页面,即使它不受限制,因为如果您登录后它会稍微改变布局。

java HttpServlet服务方法接受HttpServletRequest和HttpServletResponse对象。换句话说,这里不需要强制转换。有趣的是,如果我尝试从此处访问我的cookie,它将为我提供会话cookie的相同ID,但为我的“记住” -cookie提供一个完全不同的uid。

我发现我的系统为我的每个过滤器添加了新的记住cookie。而且,如果我尝试访问管理路径中的页面,则来自/webapp/pages的cookie和来自/webapp/pages/admin的cookie都将出现在chrome inspector中。访问过滤器中的cookie时,/webapp/pages/admin是唯一存在的cookie。相反,/webapp/pages是前端控制器servlet服务方法中唯一存在的一个。

我猜这是由于所说的过滤器和servlet的映射,它与cookie的路径匹配。问题是我从来没有打算将cookie分层存储,而只希望将其存储在/webapp/pages。现在,我的系统已在我的客户端网络上存储了许多此类更深层的cookie,并且每当用户登录和注销时,它们可能就不会与新的uid保持同步。

有没有一种方法可以强制检索/webapp/pages cookie上的/webapp/pages/admin cookie?还是有办法找回两者?如果可以管理,我可以只检查两个uid是否匹配(因此,我的问题的标题)

为了将来,我确保设置cookie的存储路径,以便使用相同的路径,但是由于cookie的有效期限为一年,因此除非很长时间才能解决我的问题,否则我找到了一种检查正确cookie的方法。

1 个答案:

答案 0 :(得分:0)

标题问题的答案是;你不能。

浏览器将确定它认为最相关的cookie,您无能为力。当您的过滤器映射到子路径,而servlet映射到更高的路径时,您将获得每个路径的最佳匹配cookie。

问题文本中的特定问题是由错误的编码模式引起的。记住我的cookie在创建时应存储在特定的路径中,在这种情况下为/webapp/pages。这样可以防止在分层路径中将cookie创建为多个。

仍然存在cookie客户端已经存在的问题。可以通过在代码的中央区域添加以下javascript来处理这些问题,在该位置您会知道所有用户都会遇到它:

document.cookie = 'remember=; path=/webapp/pages/user; expires=' + new Date(0).toUTCString();
document.cookie = 'remember=; path=/webapp/pages/admin; expires=' + new Date(0).toUTCString();

这会将不需要的Cookie设置为已过期,从而将其有效删除。

现在该域将只存在一个名称为“ remember”的cookie,并且servlet和过滤器将获取相同的cookie,而不管它们的映射子路径如何。