开启掘金成长之旅!这是我参与「掘金日新计划 · 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渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
三.应用
在这里可以验证用户在访问一些页面时,是否已登录的判断,就可以用拦截器来完成。也可以区分哪些用户拥有权限
主要是这两个配置可以成为拦截器,禁止访问
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("/**");
}
}