拦截器的使用(一)

(一)SpringMVC 中的Interceptor 拦截器在实际开发中经常遇到。比如做权限登陆,页面跳转流程控制,日志打印,特殊流程的处理等我们都可以使用拦截来进行操作。

(二)拦截器的实现  

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,

第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;

第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

通常,我们使用第一种继承HandlerInterceptorAdapter类来实现拦截器的使用

HandlerInterceptor 接口中有三个方法,大家要深入理解,才能熟练应用拦截器

(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顾名思义,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。

(2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。

(3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

  (三)通过对以上拦截器基础知识的回顾,现在我们就直接上撸代码吧

          创建一个拦截器类(要继承HandlerInterceptorAdapter 这个类)

            

       HandlerInterceptorAdapter 因为实现了HandlerInterceptor接口 所以在这里要实现接口中的三个方法

       在我们的拦截器类中,根据实际需要用到哪个就重写父类(HandlerInterceptorAdapter )的方法

        其实,主要是想让大家看一下我标红的地方。首先是返回值(上面的内容中已经介绍,大家可以结合代码进行验证)

       其次,是右边一栏的标红。如果我们想在postHandle方法中(方法执行结束渲染视图之前)获取到所拦截方法处理逻辑的返回信息(如map string Result 类型的返回值-resCode,resMsg等)。当然我们可以从ModelAndView中获取(返回结果塞入,拦截器获取)。如果是对于@ajax异步方法,这样是获取不到的 为null(已测试过)。也考虑过从response中获取,但是百度了很多地方,也尝试了别人的一些做法,但是都没有成功。最终,我采用的是在所拦截方法的return之前,将结果存入request中(request.setAttribute("xxx")),然后在自定义的拦截器类中从request中获取(request.getAttribute("xxx")),这样就解决了问题(这是一个小插曲,在实际工作中遇到过,大家莫怪……)

重写父类的方法 在里面写自己想要的逻辑代码即可

当然啦,还有一个更重要的一步必须要做的,否则咱们的拦截器是无效的(xml中配置拦截器请求拦截)

注:红框内代表自定义拦截器类的全路径(包名+类名)

       蓝框代表需要拦截的此类中的方法

        如果是拦截所有,就用path="/**" 默认拦截所有请求

       如果想拦截一个类中或者匹配的请求中,排除一些不用拦截的方法要根据实际情况而定

       Spring3.0及以下是不支持 <mvc:exclude-mapping path="/admin/login"/> //不拦截的url这个配置的

  遇到这种情况要么就升级Spring版本,要么就只能配置所有的拦截方法了啊

  小伙伴们,有更好的方法可以贴出来分享以下拉……

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值