12. springboot 里用拦截器

zhanglei 2022年06月19日 300次浏览

先回顾一下 springmvc 里的拦截器的使用:第四章 1SpringMVC拦截器 - ZhangLeiのWorld (zhangleistudy.com)

​ 新建一个 springboot 项目,项目结构如下:

image-20220619125956112

首先在 interceptor 包里创建拦截器类

package com.zhanglei.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MyInterceptor implements HandlerInterceptor {
    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor拦截器生效");
        return true;
    }
}

接着配置拦截器

​ 在 springmvc 里,必须要在 springmvc.xml 里面用标签声明配置的,如下:

​ 而在 sprngboot 里面,我们要 创建一个配置类 ,让他继承 WebMvcConfigurer 接口,就可以对 拦截器 进行配置,点进 WebMvcConfigurer 接口里可已找到对应拦截器的部分:

image-20220619143725726

再点进 InterceptorRegistry 类中:

image-20220619144031812

发现有对应的 addInterceptors 这个本地方法,方法的参数就是一个拦截器对象,返回值就是一个 InterceptorRegistry 对象,那么我们如何配置拦截器拦截的url 呢,而InterceptorRegistry 类中有方法 addPathPatterns(还有 excludePathPatterns方法),就是通过这个方法,配置拦截的 url 的:

image-20220619144753757

这样我就可以写一个 springboot 配置类如下:

package com.zhanglei.config;
import com.zhanglei.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;


@Configuration
public class MyConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        	// 创建拦截器对象,配置拦截器
        MyInterceptor myInterceptor=new MyInterceptor();
       		 		                registry.addInterceptor(myInterceptor).addPathPatterns("/zhanglei/**").excludePathPatterns("/lutingting/**");
    }
}

当然在 springmvc 中,拦截器的声明是通过 配置文件来写的,这也就通过配置文件注入了 拦截器对象,而这边这个配置类 只是创建了拦截器类,还要让他放到容器中,因此要在拦截器类上加一个 @Configuration 注解!!让框架识别到拦截器配置。

到这里为止,sprinvgboot 里面拦截器的创建、配置工作已全部完成。下面我要创建 Controller 控制器了,来对 通过拦截器验证 的请求 进行处理:

在 controller 包下 创建 MyController 类:

package com.zhanglei.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {
    @RequestMapping("/zhanglei/login1")
    @ResponseBody
    private String Controller1(){
        return "/zhanglei/login1";
    }

    @RequestMapping("/lutongting/login")
    @ResponseBody
    private String Controller2(){
        return "/lutongting/login";
    }

    @RequestMapping("/zhanglei/login2")
    @ResponseBody
    private String Controller3(){
        return "/zhanglei/login2";
    }
}

​ 根据拦截器的配置,url 以 /zhanglei/ 开头的请求全部拦截进行验证,并通过验证,移交给对应的 控制器方法处理( 因为拦截器中 preHandler 方法的返回值是true)。

验证拦截器

启动应用,在浏览器 访问 localhost:8080/zhanglei/login1

image-20220619150540137

同时 控制台执行了 prehandler 方法:

image-20220619150612538

再在浏览器访问: localhost:8080/lutongting/login

image-20220619151159685

因为 拦截器配置中:并没有拦截 /lutongting/** 的请求,来验证。因此该类请求不经过 拦截器,因此 并未执行 拦截器的 prehandler 方法,所以控制台并未输出:

image-20220619151447028