目标:用户尝试在未经身份验证的情况下访问页面。网站重定向到登录页面,当他们输入详细信息时,他们会返回到他们尝试访问的页面。
我有一个过滤器,用于记录用户在 session 中最后访问的 URL。下面的代码是我如何获取uri。
String uri = request.getRequestURI().toString();
String queryString = request.getQueryString();
String completeUri = uri;
if (queryString != null)
{
completeUri += "?" + queryString;
}
在实践中,这个过滤器接缝捕捉外部CSS文件、页面上的单个图像等,所以大约一半的时间它工作,一半的时间它指向图像或CSS文件。
过滤器的映射是...
<filter>
<filter-name>ComprehensiveFilter</filter-name>
<filter-class>core.website.control.filter.ComprehensiveFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ComprehensiveFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
所以问题是。为什么我的代码存储图像和外部文件而不是用户刚刚访问的 URL?我认为这与我的过滤器映射有关。
最佳答案
仅当您检测到未经授权的访问并重定向到登录页面时,才应使用此代码。你应该将它作为参数传递,例如 response.sendRedirect("login.jsp?" + completeUri)
现在,如果过滤器应用于每个资源(正如您所做的那样),则包含在 login.jsp 中的图像和 css 文件将触发该过滤器。您必须从该重定向中排除login.jsp 本身(否则您将进入循环),并且还必须排除css 文件。这取决于您的 URL 方案。
- 如果您的所有页面都是
.jsp
,然后将过滤器映射到*.jsp
- 如果您的操作是通过单个 servlet(例如调度程序 servlet),则将过滤器映射到该 servlet(而不是
<uri-pattern>
set<servlet-name>
) - 如果您有“漂亮的网址”,则(在过滤器中)检查请求的资源是否以
.css
结尾,.png
,.gif
等等,并且不输入重定向逻辑。
关于java - 记录url导航历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6757653/