Spring Web MVC 拦截器

1.1 简介

1.1.1 概述

  Spring Web MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是 AOP思想的具体实现。

1.1.2 拦截器(interceptor)和过滤器(filter)区别

区别过滤器拦截器
使用范围Servlet 中的一部分,任何 Java Web 工程都可以使用Spring Web MVC 框架独有
拦截范围配置了 / 全部拦截只会拦截访问控制器方法的请求,*.js 等不会拦截





1.2 简单示例

1.2.1 自定义拦截器

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/8/27
 * @description 自定义拦截器
 */
 // 实现 HandlerInterceptor 并重写需要的方法
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
                             Object handler) throws Exception {
        System.out.println("在目标方法执行之前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, 
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("在目标方法执行之后视图对象返回之前执行");

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        System.out.println("在流程都执行完毕后执行");
    }
}

1.2.2 配置拦截器
    <!-- 配置拦截器 -->
    <mvc:interceptors>
    	<!-- 可配置多个拦截器,执行顺序为配置顺序 -->
        <mvc:interceptor>
            <!-- 拦截的资源路径 -->
            <mvc:mapping path="/**"/>
            <!-- 指定自定义拦截器 -->
            <bean class="com.software.spring.controller.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

1.2.3 控制器

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/8/27
 * @description 控制器
 */
@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/get")
    public String get() {
        System.out.println("请求到了");
        return "10086";
    }
}

在这里插入图片描述




1.3 HandlerInterceptor 中的方法

1.3.1 preHandle

  方法将在请求处理之前进行调用,该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时就会继续调用下一个 Interceptor 的 preHandle 方法。


1.3.2 postHandle

  该方法是在当前请求进行处理之后被调用,前提是 preHandle 方法的返回值为 true 时才能被调用,且它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作

1.3.2 afterCompletion

  该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,前提是 preHandle 方法的返回值为 true 时才能被调用

1.3.2 执行顺序

  当拦截器的 preHandle 方法返回 true 则会执行目标资源,如果返回 false 则不执行目标资源;多个拦截器情况下,配置在前的先执行,配置在后的后执行;单个拦截器中的方法执行顺序是:preHandler目标资源postHandleafterCompletion;多个拦截器中的方法执行顺序是:preHandler_1preHandler_2···preHandler_n目标资源postHandle_n···postHandle_2postHandle_1afterCompletion_n ☞ ··· ☞ afterCompletion_2afterCompletion_1




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC中,拦截器可以用来在处理请求之前或之后进行一些额外的处理。要编写拦截器,你需要按照以下步骤进行操作: 1. 创建一个实现HandlerInterceptor接口的拦截器类,通常可以继承HandlerInterceptorAdapter类来简化实现。例如: ```java import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CustomInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截处理 return true; // 返回true表示继续处理请求,返回false表示中断请求处理 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后进行拦截处理,但在渲染视图之前 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在完成整个请求处理之后进行拦截处理,包括渲染视图之后 } } ``` 2. 在Spring配置文件中注册拦截器。例如,在XML配置中,可以使用<mvc:interceptors>元素来注册拦截器: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有路径 --> <bean class="com.example.CustomInterceptor"/> <!-- 拦截器类的全限定名 --> </mvc:interceptor> </mvc:interceptors> ``` 3. 你也可以为拦截器指定特定的路径,例如: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/admin/**"/> <!-- 只拦截以/admin/开头的路径 --> <bean class="com.example.CustomInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 这样,当请求匹配到拦截器所指定的路径时,拦截器的preHandle()方法将被调用。你可以在这个方法中进行一些前置处理,例如权限验证、日志记录等。 需要注意的是,拦截器可以有多个,并且按照注册顺序依次执行。如果有多个拦截器,那么在请求处理前后,它们的preHandle()、postHandle()和afterCompletion()方法将按照注册顺序被依次调用。 希望上述内容能对你有所帮助!如果你还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值