Tomcat项目使用过滤器拦截所有页面后,无法显示图片

使用过滤器拦截所有页面时遗留下来的问题:

  Tomcat项目使用过滤器将所有页面(除了登录页面)都设置访问权限,防止用户通过URL绕过登录步骤,非法访问那些受限的页面资源。这个将所有页面都通过过滤器拦截的目的是实现了,但是新的问题伴随而来。
  当我调试时,出现了如下现象:
在这里插入图片描述
  可以看到,我的登录页面的图片没有加载进来,使用谷歌浏览器的调试工具,可以看到不仅仅是我的图片没有加载进来,连js和css都没法成功加载。那这可能是被过滤器拦截了?于是我先不管这个缺失图片的登录页面,输入我的账号密码,点击登录。登录成功后在浏览器中输入我登录页面的url(localhost:8080/index.jsp),发现图片和css等都恢复正常了,如下:
在这里插入图片描述
  也就是说,虽然我在web.xml中设置了index.jsp(登录页面)可以直接放行,在Filter中也实现了该目标的代码。登录页面是被无条件放行了,但是当浏览器在请求登录页面的图片和css等资源时,由于它们不在放行名单中,因此被拦截,所以登录页面的图片才显示不出来。
  而当我在那个缺失了图片和css支持的页面中输入了账号和密码并成功登陆后,再次返回登陆页面,一切都恢复了正常。这是因为当我登陆成功后,我就成了合法用户(可以访问那些受限的资源),再次访问登陆页面时,过滤器自然会为我放行那些图片和css。这也进一步证实了之前图片和css无法加载是因为过滤器的问题。
  既然知道了问题所在,那么就好解决了。过滤器将我们的登录页面的图片和css等拦截了,我们将它放行即可,实现如下(在Filter中):

HttpServletRequest req = (HttpServletRequest) arg0;
String url = req.getRequestURI();	//  获取请求的url
if(url.contains(".css") || url.contains(".js")||url.contains(".png")) { 
	arg2.doFilter(arg0, arg1);		//  如果url中包含.css或.png直接放行
}

  可以知道,当我们通过浏览器访问自己项目的登录页面时(我的是localhost:8080/index.jsp),浏览器发出请求,它先拿到的是我们的jsp页面的文件,当它解析时,发现里面有css和图片,那么它就再次发送请求,很遗憾的是当这些请求到达过滤器时,由于这些资源不在免过滤名单中,而且这些请求也不是已登录用户发送过来的,过滤器很无情地将这些“非法”请求全部拦截,因此我们的登录页面也就无法加载这些资源了,从而导致页面显示异常。
  通过这次的经验,在以后的项目中,使用“/*”来将所有页面都设置访问权限时,不仅仅是要放行登录页面,还要兼顾页面中的css和图片等资源。以防忘记,在此记下笔记。

发布了2 篇原创文章 · 获赞 0 · 访问量 31

猜你喜欢

转载自blog.csdn.net/Nebula_DIX/article/details/105031581
今日推荐