SpringMVC之拦截器

1.拦截器(Interceptor)

(1)拦截器概念

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

(2)拦截器作用

在指定的方法调用前后执行预先设定的代码和阻止原始方法的执行

(3)拦截器执行顺序

2.拦截器参数

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

3.拦截器代码案例

(1)定义一个拦截器

定义一个类实现HandlerInterceptor接口

java 复制代码
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)方法

java 复制代码
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.拦截器链

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

相关推荐
jingde5285 天前
SpringMVC中使用REST风格
springmvc
垚森14 天前
SpringBoot兼容SpringMVC带有.do后缀的请求
springmvc·.do后缀
_leyilea14 天前
Java内存马系列 | SpringMVC内存马 - 上 | SpringMVC代码分析
java·开发语言·springmvc·内存马
沿途欣赏i17 天前
关于SpringMVC的理解
springmvc
m0_7194145620 天前
【SpringMVC】
java·springmvc
王小二(海阔天空)24 天前
浅谈SpringMvc的核心流程与组件
springmvc·核心流程·核心组件
S-X-S1 个月前
SpringMVC核心机制环境搭建
springmvc
S-X-S1 个月前
自定义@ResponseBody以及SpringMVC总结
springmvc
空谷忧人1 个月前
【SpringMVC】SpringMVC中单元方法获取请求数据的方式
java·后端·mvc·springmvc
醉颜凉1 个月前
SpringMVC 运行流程
java·面试·mvc·springmvc·model·controller·view