2011-07-20 49 views
1

目标:用户尝试访问未经验证的网页。网站重定向到登录页面,当他们输入详细信息时,他们将返回到他们尝试访问的页面。录制网址导航历史记录

我有一个过滤器,记录用户在会话中的最后一个网址。下面的代码是我如何获得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> 

所以问题是。为什么我的代码存储图片和外部文件,而不是用户刚刚访问的网址?我认为这与我的过滤器映射有关。

回答

1

只有在您检测到未经授权的访问并重定向到登录页面时,您才应该使用此代码。并且您应该将它作为参数传递,如response.sendRedirect("login.jsp?" + completeUri)

现在,如果过滤器应用于每个资源(与您一样),它将针对login.jsp中包含的图像和css文件触发。您必须从此重定向中排除login.jsp本身(否则您将进入循环),并且还必须排除css文件。这取决于你的URL方案。

  • 如果您所有的网页都.jsp,然后映射过滤器*.jsp
  • 如果你的行为可以通过一个单一的servlet(如分发程序Servlet),然后将过滤器映射到这个servlet(而不是<uri-pattern>设置<servlet-name>
  • 如果您有“漂亮的网址”,则(在过滤器中)检查请求的资源是否以.css,.png,.gif等结尾,并且不要输入重定向逻辑。
0

如果页面上有任何图像,即表示html <img>标记,则标记的src属性指的是实际的URL(请参阅http://www.w3schools.com/tags/tag_img.asp)。所以当页面被加载时,浏览器发出另一个请求来加载该图像。您的过滤器不仅捕获整个页面的请求,还捕获这些图像加载请求。

+0

非常感谢您的答复。有没有办法将过滤器映射到仅过滤servlet。我可以看到如何通过使用* .jsp来执行此操作,但无法仅过滤servlet。 – user845729