Spring MVC拦截器2:拦截器入门二:拦截器使用技巧;(<mvc:exclude-mapping path=““/>:设置不拦截的url;多个拦截器执行顺序;preHandle()方法的返回值)

说明:

(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.一种反向思维:

二:多个拦截器;

1.多个拦截器的执行顺序;

(1)多个拦截执行顺序:简述;

(2)多个拦截器的执行顺序:演示; 

三:拦截器中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,返回响应,中断请求】;

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值