繁体   English   中英

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

[英]How can I retrieve all cookies, even with the same name and same domain, in java servlet filter?

我有一个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 ,则chrome inspector中将同时存在来自/webapp/pages/admin cookie和来自/webapp/pages/admin cookie。 当访问过滤器中的cookie时, /webapp/pages/admin是唯一存在的一个。 相反, /webapp/pages是前端控制器servlet服务方法中唯一存在的一个。

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

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

将来,我已经确定要设置Cookie的存储路径,以便使用相同的路径,但是由于Cookie的有效期限为一年,因此除非我找到解决方案,否则很长一段时间都无法解决我的问题检查正确的cookie的方法。

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

浏览器将确定它认为最相关的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,而不管它们的映射子路径如何。

暂无
暂无

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

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