先回顾一下 springmvc 里的拦截器的使用:第四章 1SpringMVC拦截器 - ZhangLeiのWorld (zhangleistudy.com)
新建一个 springboot 项目,项目结构如下:
首先在 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 接口里可已找到对应拦截器的部分:
再点进 InterceptorRegistry 类中:
发现有对应的 addInterceptors 这个本地方法,方法的参数就是一个拦截器对象,返回值就是一个 InterceptorRegistry 对象,那么我们如何配置拦截器拦截的url 呢,而InterceptorRegistry 类中有方法 addPathPatterns(还有 excludePathPatterns方法),就是通过这个方法,配置拦截的 url 的:
这样我就可以写一个 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
同时 控制台执行了 prehandler 方法:
再在浏览器访问: localhost:8080/lutongting/login
因为 拦截器配置中:并没有拦截 /lutongting/** 的请求,来验证。因此该类请求不经过 拦截器,因此 并未执行 拦截器的 prehandler 方法,所以控制台并未输出: