目标:用户尝试访问未经身份验证的页面。站点重定向到登录页面,当他们输入详细信息时,会将其返回到他们尝试访问的页面。
我有一个过滤器,用于记录用户在会话中的最后一个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>
所以问题是。为什么我的代码存储图像和外部文件而不是用户刚才的网址?我认为它与我的过滤器映射有关。
答案 0 :(得分:1)
只有在您检测到未经授权的访问并重定向到登录页面时,才应使用此代码。你应该把它作为param传递,比如response.sendRedirect("login.jsp?" + completeUri)
现在,如果过滤器应用于每个资源(就像你一样),它将被触发包含在login.jsp中的图像和css文件。您必须从此重定向中排除login.jsp本身(否则您将进入循环),并且还必须排除css文件。这取决于您的URL方案。
.jsp
,请将过滤条件映射到*.jsp
<uri-pattern>
set <servlet-name>
).css
,.png
,.gif
等结尾,并且不要输入重定向逻辑。答案 1 :(得分:0)
如果页面上有任何图片,即html <img>
标记,则标记的src
属性会引用实际网址(请参阅http://www.w3schools.com/tags/tag_img.asp)。因此,当加载页面时,浏览器会发送另一个加载该图像的请求。您的过滤器不仅会捕获整个页面的请求,还会捕获那些图像加载请求。