JavaEE简单示例——SpringMVC的拦截器

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。JavaEE简单示例——SpringMVC的拦截器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

简单介绍:

拦截器的作用就相当于我们之前在JavaWeb中学到的有关过滤器的作用是一样的,都是在请求到达资源之前,对请求做一些比如权限检查,记录日志等操作, 但是过滤器会默认过滤所有的对于servlet的请求,而拦截器只会拦截SpringMVC的请求. 简单来说,拦截器的作用就是在请求到达控制器方法之前对请求进行一些操作的部件 而我们学习拦截器,我们主要会了解到如何创建一个拦截器,如何配置拦截器,以及拦截器的执行流程

首先,我们来看如何创建一个拦截器

创建拦截器一般有两种方法:

  • 实现HandlerInterceptor接口定义拦截器
  • 继承HandlerInterceptor接口的实现类HandlerInterceptorAdapter类

这两种方法都可以创建一个拦截器,区别在于,实现接口的方式需要重写接口的所有方法,而继承类的方式只需要重写回调方法就可以实现拦截器的功能,我们主要介绍实现接口的方式去创建一个拦截器

package SpringMVC.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PerHandler implements HandlerInterceptor {
//    这个方法是请求到达控制器方法之前执行的
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行了");
        return true;
    }
//这个方法是请求达到了控制器方法,但是控制器方法渲染页面之前执行的
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法执行了");
    }
//这个方法是请求执行完毕之后执行的回调函数
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法执行了");
    }
}

我们首先创建一个普通的类,然后实现HandlerInterceptor接口,然后看看需要重写那些方法,然后我们对重写的方法做一个简单的介绍 可以看到有三个方法需要我们重写,我们对这三个方法进行一个简单的介绍:

  • preHandle():这个方法用于对程序进行安全控制,权限校验等,他会在控制器方法调用前执行
  • postHandle():这个方法用于对请求域中的模型和视图做进一步的修改,他会在控制器方法调用之后且视图解析器之前调用.可以通过这个方法的第三个参数modelAndView读取和调整返回结果对应的数据与视图
  • afterCompletion():这个方法可以完成一些资源清理,日志信息记录等工作,他会在整个请求完成后执行,即视图渲染完成之后调用.在这个方法中,可以对程序中出现的异常进行封装后单独进行处理

需要格外注意的一点是只有当preHandle()方法的返回值是true的时候,他后面的两个方法才能顺利执行,如果返回值是false,则执行完preHandle()方法之后,剩下的两个方法将不会执行 在了解拦截器接口中的三个方法的作用以及执行顺序之后,我们在三个方法中简单的写一些输出语句,方便我们在拦截器其中之后观察拦截器方法的运行过程

拦截器的配置

我们将介绍拦截器的两种配置方式,其实拦截器的配置主要在于配置拦截的路径

拦截所有的路径

要拦截来自所有路径的请求,我们只需要在spring-mvc.xml文件中,使用mvc:interceptors标签进行配置,这是配置拦截器的根标签,然后只需要使用bean标签,然后class属性指向我们自己创建的拦截器即可 要精确拦截来自某些路径的请求,那么我们需要添加一些额外的配置:使用mvc:mapping标签的path属性可以配置拦截器拦截的路径,如果想要设置不拦截某些路径,可以使用mvc:exclude-mapping的path属性设置不想拦截的路径 接下来我们就分别使用代码实现这两种拦截器的拦截方式

<!--    配置拦截器-->
    <mvc:interceptors>
<!--        直接使用bean标签配置class属性的方式,表示设置拦截来自所有路径的请求-->
<!--        <bean class="SpringMVC.Interceptor.PerHandler"/>-->
        <mvc:interceptor>
<!--            设置需要拦截的路径-->
            <mvc:mapping path="/ResponseRespinseBodyJson"/>
<!--            设置不需要拦截的路径-->
            <mvc:exclude-mapping path="/addData"/>
<!--            配置拦截器类-->
            <bean class="SpringMVC.Interceptor.PerHandler"/>
        </mvc:interceptor>
    </mvc:interceptors>

在配置完成之后,我们就可以重启项目,访问一个路径去查看它的拦截效果

JavaEE简单示例——SpringMVC的拦截器

JavaEE简单示例——SpringMVC的拦截器 

可以看到,我们访问了拦截路径,我们显示了页面,并且在控制台上打印出了我们在方法中添加的输出语句,并且我们还可以看出来这些方法的执行顺序 

拦截器的运行顺序

对于拦截器的运行顺序,我们主要介绍两种情况,一种是单个拦截器的运行顺序,一种是多个拦截器的运行顺序

单个拦截器的运行顺序

对于单个拦截器的运行顺序,就是拦截器中三个方法的运行顺序,之前我们已经介绍过了,简单来说就是:proHandle->postHandle->afterHandle的运行顺序,这个顺序之前我们在运行程序的时候已经验证过了

多个拦截器的运行顺序

对于多个拦截器的运行顺序,主要需要介绍了就是拦截器的运行顺序,以及拦截器中方法的运行顺序.当存在多个拦截器的时候,按照字典顺序进行拦截器的排序,也就是,按照字母或者数字的自然排序决定谁先执行,然后是拦截器中的方法的执行顺序 preHandle方法是顺序执行,其他两个方法的执行顺序相反,这就是拦截器中方法的基本执行流程 比如现在,有两个拦截器分别叫A1和A2,那么他们的执行顺序就是这样的: A1 -> A1.preHandle -> A2 -> A2.preHandle -> A2.postHandle ->A1.postHandle -> A2.afterCompletion -> A1.afterHandle 也就是说,在preHandle方法执行的时候,还是按照A1在前,A2在后的形式,在执行其他两个方法时候就反过来了,变成了先执行A2的方法,再执行A1的方法 这个运行循序只需要了解知道就可以,在实际使用中,我们可以根据程序的运行情况再去做调整

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153274.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!