SpringMVC拦截器拦截页面(坑)
问题:在使用了MVC拦截器时,访问除登录页面以外的URL时,判断是否登录,未登录的访问全部跳转至登录界面,但是在设置好时,是会判断并跳转,但是在起初,未登录访问,会先进入访问的资源页面后,立即闪退去登录页面。
但是明显这种状况是不满足权限拦截需求的,是错误操作。
原因就在于一开始在web.xml中配置了 default默认servlet 然后对 *.html 资源的放行(因为不配无法访问到html资源。)
在web.xml文件中经常看到这样的配置<servlet-name>default</servlet-name>,这个配置的作用是:对客户端请求的静态资源如图片、JS文件等的请求交由 默认的servlet进行处理,如下所示:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ico</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
如何你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg,*.html等静态文件的访问也就被拦截了。
即使你之后在mvc的拦截器中进行了部分资源的放行也依旧无法访问静态资源,因为你访问静态资源时DispatcherServlet会将你的请求先拦截,放行后返回浏览器的依旧是/***.html,会再次访问,然后又进DispatcherServlet,如此循环。
所以,default默认servlet的配置还是必须的。
于是问题就产生了,下面是我开始的配置(web.xml中):
<!--避免springmvc拦截以html结尾的请求-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
但是,这样虽然表面上的功能都实现了,却会出现开始阐述的问题,没登录还是能有一瞬间看到被拦截的资源。
解决方式很简单,在web.xml删除上面的配置,将 该默认servlet配置 移到mvc的配置文件中配置,如下:
<!-- 配置静态资源 默认servlet配置 允许使用"/"做整体映射 等-->
<mvc:default-servlet-handler />
重新运行,问题解决,不会再进入被拦截页面后又闪跳会登录界面了。