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

文章介绍了SpringMVC中的拦截器作用,它用于在请求到达控制器之前进行权限检查和日志记录等操作。拦截器通过实现HandlerInterceptor接口创建,包括preHandle、postHandle和afterCompletion三个关键方法。配置拦截器可以通过mvc:interceptors标签,可以精确拦截特定路径并排除某些路径。文章还讨论了单个和多个拦截器的执行顺序。
摘要由CSDN通过智能技术生成

简单介绍:

拦截器的作用就相当于我们之前在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>

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

 

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

拦截器的运行顺序

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

单个拦截器的运行顺序

对于单个拦截器的运行顺序,就是拦截器中三个方法的运行顺序,之前我们已经介绍过了,简单来说就是: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的方法 这个运行循序只需要了解知道就可以,在实际使用中,我们可以根据程序的运行情况再去做调整

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值