SpringMVC之拦截器

发布于:2024-04-14 ⋅ 阅读:(70) ⋅ 点赞:(0)

1.拦截器(Interceptor)

(1)拦截器概念
拦截器是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

(2)拦截器作用
在指定的方法调用前后执行预先设定的代码和阻止原始方法的执行

(3)拦截器执行顺序
在这里插入图片描述

2.拦截器参数

参数 描述
HttpServletRequest request 请求对象
HttpServletResponse response 响应对象
Object handler 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装
ModelAndView modelAndView 如果处理器执行完成具有返回结果,可以读取到对应数据和页面信息,并进行调整
Exception ex 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理

3.拦截器代码案例

(1)定义一个拦截器
定义一个类实现HandlerInterceptor接口

package controller;

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

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

@Component // 自定义拦截器需要被SpringMVC配置类扫描到
public class ExampleInterceptor 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("在原始方法之后执行的代码");
    }

    // 在postHandle之后执行的代码
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("在postHandle之后执行的代码");
    }
}

(2)设置拦截器拦截的控制器
实现WebMvcConfigurer接口的void addInterceptors(InterceptorRegistry registry)方法

package config;

import controller.ExampleInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ComponentScan("controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer{
    @Autowired
    private ExampleInterceptor exampleInterceptor;

    // 定义具体的拦截器配置
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(exampleInterceptor)// 添加拦截器
                .addPathPatterns("/demo");// 该拦截器拦截的请求
    }
}

4.拦截器链

配置多个拦截器时,会形成拦截器链。拦截器链的运行顺序参照拦截器添加顺序为准。当拦截器中出现对控制器的拦截,该拦截器后续执行会终止但不影响前面拦截器的后续执行