目标:用户试图访问未经身份验证的页面。网站重定向到登录页面,当他们输入详细信息时,他们被返回到他们试图访问的页面。
我有一个过滤器,记录用户在会话中的最后一个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>
设置<servlet-name>
) - 如果你有"漂亮的url",那么(在过滤器中)检查请求的资源是否以
.css
,.png
,.gif
等结束,并且不输入重定向逻辑。
如果页面上有任何图像,即html <img>
标记,则标记的src
属性引用实际的URL(参见http://www.w3schools.com/tags/tag_img.asp)。因此,当页面被加载时,浏览器会发出另一个请求来加载该图像。您的过滤器不仅捕获整个页面的请求,还捕获那些图像加载请求。