您现在的位置是:首页 >技术交流 >SpringMvc拦截器使用介绍网站首页技术交流

SpringMvc拦截器使用介绍

学全栈的灌汤包 2023-07-09 12:00:03
简介SpringMvc拦截器使用介绍

拦截器

拦截器基本介绍

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

作用

在指定的方法调用前后执行预先设定的代码

阻止原始方法的执行(例如权限管理)

执行流程:

在这里插入图片描述

拦截器与过滤器的区别:

归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

拦截器快速入门

案例需求:

制作拦截器功能类;

配置拦截器的执行位置

实现步骤如下:

创建拦截器功能类ProjectInterceptor实现HandlerInterceptor接口, 并声明为bean; 推荐在controller包下创建一个interceptor, 在该包下写拦截器功能类

@Component
public class ProjectInterceptor implements HandlerInterceptor {
    @Override
    // 原始方法执行之前执行的操作
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
      	// 如果return的是false表示终止原始方法执行, 以及终止原始方法执行之后的拦截器操作
        return true;
    }

    @Override
    // 原始方法执行之后执行的操作
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    // 原始方法执行完成之后, 且在postHandle方法执行之后执行的操作
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 设置访问哪个路径时使用哪个拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books");
    }
}

SpringMvcConfig中加载SpringMvcSupport配置类

@Configuration
@ComponentScan({"com.chenyq.controller", "com.chenyq.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

目前拦截器可以拦截所有访问/users的请求, 但是/users/100这样路径的请求并不会拦截; 添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个, 我们可以在配置一个路径用于拦截类似于/users/100这样的路径

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        // 设置访问哪个路径时使用哪个拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");
    }
}

配置类简化开发: 让SpringMvcConfig核心配置类, 实现标准接口WebMvcConfigurer简化开发(注意:侵入式较强)

@Configuration
@ComponentScan("com.chenyq.controller")
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users", "/users/*");
    }
}

拦截器执行流程:

在这里插入图片描述

拦截器参数

前置处理:

参数:

  • request:请求对象
  • response:响应对象
  • handler: 描述的是对原始方法的封装,本质上是一个方法对象,对反射技术中的Method对象进行了再包装, 获取handler对象就可以操作原始执行的方法

返回值:

  • 返回值为false,被拦截的处理器将不执行
@Override
// 原始方法执行之前执行的操作
public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}

后置处理:

参数

  • request和response参数与前置处理一样
  • modelAndView: 如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
@Override
// 原始方法执行之后执行的操作
public void postHandle(HttpServletRequest request, 
                       HttpServletResponse response, 
                       Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle");
}

完成后处理:

参数:

  • request和response参数与前置处理一样
  • ex: 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
@Override
// 原始方法执行完成之后, 且在postHandle方法执行之后执行的操作
public void afterCompletion(HttpServletRequest request,
                            HttpServletResponse response,
                            Object handler, Exception ex) throws Exception {
    System.out.println("afterCompletion");
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。