springboot中配置拦截器及使用

1、什么是拦截器

SpringMVC拦截器(Interceptor)可实现对每一个请求处理前后进行相关的业务处理,类似于servlet中的Filter。
它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor来实现的。

2、自定义拦截器(Interceptor)

只需要实现 HandlerInterceptor 这个接口即可,该接口有三个可以实现的方法,如下:

  • preHandle
    该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,当返回值为true时就会继续下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;
  • postHandle
    该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
  • afterCompletion
    该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理。
    示例:
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    
    


	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    

		// 核心业务逻辑,判断是否登录等
		String token = request.getHeader("token");
		System.out.println(token);
		// 正常token是的登录后签发的,前端携带过来
		return StringUtils.hasLength(token);
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    

	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    

	}

}

使用该拦截器模拟对登录外的所有请求拦截,获取请求header中携带过来的token ,如果header中没有token则直接拦截,有token放行

3、运用在项目中(springboot)

在confing文件夹下,创建一个SpringMvcConfig配置类去实现(implements)WebMvcConfigurer接口,并实现其中的 addInterceptiors() 方法即可:
PermissionInterceptor 是上面的拦截器示例

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    
    

    @Resource
    private PermissionInterceptor permissionInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
         registry.addInterceptor(permissionInterceptor).addPathPatterns("/**").excludePathPatterns("/app/loginTest");
    }

}

permissionInterceptor用来拦截所有请求;

创建controller:

@RestController
@RequestMapping("/app")
public class AppController {
    
    
    @RequestMapping("/hello")
    public void hello(){
    
    
        System.out.println("111111");
    }

    @RequestMapping("/loginTest")
    public String world(){
    
    
        return "success";
    }
}

通过浏览器访问/app/hello
在这里插入图片描述
下图中可以看到,hello接口没有打印111111,因为我是直接通过浏览器访问接口,token肯定是没有的,则preHandle返回false,意味着该请求被拦截器打回了
在这里插入图片描述
那我们试试login是否可以被过滤掉。
在这里插入图片描述
访问在没有携带token参数的时候成功返回,就是因为我们的拦截器排除了app/loginTest请求。

猜你喜欢

转载自blog.csdn.net/m0_51963973/article/details/129965921