说明:
(1)本篇博客合理性解释:
● 在【Spring MVC拦截器1:拦截器入门一:拦截器(interceptor)简介;拦截器开发流程简介;演示了拦截器最基本的配置流程;】中,已经展示了拦截器的基本使用流程,了解了【preHandle()、postHandle()、afterCompletion()方法的基本情况】;但是拦截器在实际时,还有很多问题需要解决:为此,写了本篇博客;
(2)本篇博客的代码,沿用自【Spring MVC拦截器1:拦截器入门一:拦截器(interceptor)简介;拦截器开发流程简介;演示了拦截器最基本的配置流程;】;中的【interceptor工程】;
(3)本篇博客主要内容:
● 一个话题:如何让拦截器不拦截某些url;由此引出了【<mvc:exclude-mapping path=""/>】标签;
● 多拦截器时的执行顺序;
● 拦截器的perHandle()方法的return值;(如果return false,那么拦截器就相当于一个“阻断器”);
目录
一:标签:设置【不拦截的url】;<mvc:exclude-mapping path=""/>一:标签:设置【不拦截的url】;
1.先看一个客观情况:只要一个资源的url符合“拦截器的path”,那么访问该资源的时候,这个请求就会被拦截器处理;
2.通过【<mvc:exclude-mapping path=""/>2.通过【
3.在实际开发中,一种很好的开发经验:对于静态资源:可以把静态资源放在特定的目录(如resources目录)中,来简化【<mvc:exclude-mapping path=""/>3.在实际开发中,一种很好的开发经验:对于静态资源:可以把静态资源放在特定的目录(如resources目录)中,来简化【
4.一种反向思维:<mvc:mapping path="/restful/**"/>4.一种反向思维:
三:拦截器中preHandle()方法的返回值:【return true】或【return false】;
1.preHandle()方法:return false:相当于一个“阻断器”;
2. 在实际开发中,可以利用【preHandler()方法的return值】:来决定【放行请求】还是【立即响应,中断请求】;
一:<mvc:exclude-mapping path=""/>标签:设置【不拦截的url】;
1.先看一个客观情况:只要一个资源的url符合“拦截器的path”,那么访问该资源的时候,这个请求就会被拦截器处理;
对于【interceptor工程】,启动Tomcat,访问【localhost/client.html】;
看后台,会发现:.html,.js这些资源,拦截器都拦截了;(主要是.js这些静态资源也被拦截了)
即,上面的案例主要说明:
● 我们知道所有资源都有一个uri,自然其也有url(uri是url的一部分);
● 我们访问某个资源时候,只要该资源的url符合【拦截器的path属性】,那么【访问这个资源的url时,这个请求就会被拦截】;
但是,在绝大部分情况下,对于【.js,.ico,.jpg】等静态资源,我们并不希望拦截器对其进行处理;所以,当我们访问【.js,.ico,.jpg等静态资源】时,如何不拦截这些请求,就是接下里要介绍的内容;
2.通过【<mvc:exclude-mapping path=""/>】标签:设置【不拦截的url】;(在实际开发中,一般通过这个标签,设置不去处理【.js,ico,jpg】等静态资源;)
启动Tomcat,观察效果:
3.在实际开发中,一种很好的开发经验:对于静态资源:可以把静态资源放在特定的目录(如resources目录)中,来简化【<mvc:exclude-mapping path=""/>的配置】;
可以看到,如果我们的资源都存放在webapp的根路径中时:
那么我们通过【<mvc:exclude-mapping path=""/>】的方式去设置时,每一类静态资源都需要配置,这工作量有点大,不太好;
但是,如果把所有静态资源存放在某个目录中,那么【<mvc:exclude-mapping path=""/>】的方式去设置时,就会方便很多;这也是我们在实际开中,常采用的一种策略;
4.一种反向思维:<mvc:mapping path="/restful/**"/>:只去过滤特定的地址;
这样以后,拦截器只会拦截以【/restful/】开头的url了;(其他url不会拦截,自然那些【.js,ico,jpg】等静态资源也不会拦截了;)
……………………………………………………
然后,如果有多少个需要拦截的url,在后面直接追加就行了;
……………………………………………………
上面在applicationContext.xml中配置过程虽然有点麻烦,但是有几点好处:
● applicationContext.xml是全局性的,我们在这儿配置后,整个项目都适用;
● 我们在applicationContext.xml中的【<mvc:mapping path="/restful/**"/>】配置,也可以看成是一种【规则和限制】;程序员在编写代码的时候,如果涉及到该模块,那么url就必须按照【restful】的规则去书写;这也能提高项目的规范程序;
二:多个拦截器;
1.多个拦截器的执行顺序;
(1)多个拦截执行顺序:简述;
说明:
(1)【拦截器1】和【拦截器2】是根据在applicationContext.xml中的配置顺序来定的;
(2)执行顺序:(前提是一切顺利,畅通无阻,都能执行的到)
● 请求过来的时候,请求还未到Controller的时候:会依次执行的【拦截器1的preHandle()方法,拦截器2的preHandle()方法】;
● 执行Controller逻辑代码;然后,Controller方法return;(但还未产生响应文本之前)
● 在响应文本未产生之前,反向依次执行【拦截器2的postHandle()方法,拦截器1的postHandle()方法】;
● 产生响应文本;
● 反向执行【拦截器2的afterCompletion()方法,拦截器1的afterCompletion()方法】;
(2)多个拦截器的执行顺序:演示;
首先,在创建一个拦截器类:MyInterceptor2类;
然后,配置下MyInterceptor2拦截器类;在这个配置中,MyInterceptor类配置在前(其就相当于拦截器1);MyInterceptor2类配置在前(其就相当于拦截器2);
然后,启动Tomcat;
![]()
三:拦截器中preHandle()方法的返回值:【return true】或【return false】;
我们已经知道:
● 如果preHandle()方法,返回true的话:那么请求就会被送给后面的拦截器(如果还有的话),或者送给Controller;
● 如果preHandle()方法,返回false的话:那么当前的请求就会被阻止,直接产生响应,返回给客户端;
● 即,这个return的结果,决定了当前请求是继续向后传递执行,还是立即结束、返回响应;
1.preHandle()方法:return false:相当于一个“阻断器”;
![]()
启动Tomcat,访问;
说明:
(1)当拦截器的preHandler()方法,return false时:这个拦截器就相当于一个阻断器;
(2)一旦拦截器的preHandler()方法,return false时:那么请求就会立即中断,响应就直接在这个preHandler()方法中产生了;
2. 在实际开发中,可以利用【preHandler()方法的return值】:来决定【放行请求】还是【立即响应,中断请求】;
![]()
由此可见,利用拦截器的preHandle()方法的return返回值,可以做很多事情;比如,对于某个url请求,preHandle()方法可以对其进行前置检查,如果符合要求就【preHandle()方法就return true,放行请求】;如果不符合要求就【preHandle()方法就return false,返回响应,中断请求】;