拦截器

104 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

一.概念

拦截器经常用来处理登录、权限验证问题。它是SpringBoot的一个强大的控件,它可以使得程序在进入控制器之前做一些操作,或在控制器方法完成后、甚至是在视图渲染时进行操作,经常用于对控制器方法进行预处理和后处理。

只有使用了SpringMVC框架的工程才能使用拦截器,拦截器只会拦截访问控制器的url。

二.SpringMVC中具体实现

SpringMVC中提供了一个HandlerInterceptor接口,所有的拦截请求都是通过该接口来实现的。这个接口定义了三个方法,可以通过这三个方法来对用户的请求进行拦截处理。

1.preHandle方法:在请求处理之前进行调用

  • 为 false: 表示不放行,后续的 Interceptor 和 Controller 都不能执行;
  • 为 true: 表示放行,会继续调用下一个 Interceptor 的 preHandle 方法,或当前请求的 Controller 方法。

2.postHandle方法:即在当前请求进行处理之后,也就是 Controller 方法调用之后执行,但是它会在 DispatcherServlet进行视图返回渲染之前被调用,所以可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。

3.afterCompletion方法:该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

image.png

三.应用

在这里可以验证用户在访问一些页面时,是否已登录的判断,就可以用拦截器来完成。也可以区分哪些用户拥有权限

image.png 主要是这两个配置可以成为拦截器,禁止访问

MyIntercepter.java

import com.example.demo.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer{

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //追加拦截器,配置拦截的路径,这里拦截对控制器所有方法的请求
        registry.addInterceptor(this.myInterceptor) .addPathPatterns("/**");
    }
}

WebConfig.java

import com.example.demo.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer{

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //追加拦截器,配置拦截的路径,这里拦截对控制器所有方法的请求
        registry.addInterceptor(this.myInterceptor) .addPathPatterns("/**");
    }
}