文章目录
- SpingBoot拦截器
- 拦截器与过滤器的区别:
- 1.HandlerInterceptor接口
- 2.WebMvcConfigurer接口
- 3.示例:
SpingBoot拦截器
【SpringWeb框架中的拦截器作用类似于过滤器,都可以对一个请求进行拦截处理。】
我们可以用拦截器做很多事情:
- 日志记录:记录请求信息的日志,以便进行信息监控、信息统计等;
- 权限检查:如登录校验,在处理器处理之前先判断是否已经登录;
- 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
- 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的都可以用拦截器来实现。
拦截器与过滤器的区别:
过滤器:
- servlet规范中的一部分,任何java web程序都可以使用。
- 在url-pattern中配置之后,可以对所要访问的资源进行拦截。
拦截器:
- 拦截器在SpringMvc框架自己的,只有使用了SpringMvc框架工程才能使用。
- 拦截器只会拦截访问控制器的方法,如果访问的是js,css,image…是不会进行拦截的。
1.HandlerInterceptor接口
SpringBoot中拦截器的接口名称是HandlerInterceptor,接口里有三个方法:
方法说明:
preHandle
:在业务处理器Controller处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;postHandle
:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndViewafterCompletion
:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
public interface HandlerInterceptor {
/**
* preHandle是请求执行前执行的
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
/**
* postHandler是请求结束,在DispatcherServlet 渲染视图之前执行的,
* 当preHandle返回true才会执行
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
/**
* afterCompletion是视图渲染完成后才执行
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
2.WebMvcConfigurer接口
WebMvcConfigurer接口配置拦截路径
三种方式:
- 继承WebMvcConfigurerAdapter spring5.0 以弃用,不推荐
实现WebMvcConfigurer
推荐- 继承WebMvcConfigurationSupport 会导致springboot自动配置失效
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(拦截xxx)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
.excludePathPatterns("/user/logout");
}
- addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
- addPathPatterns:用于设置拦截器的过滤路径规则;
addPathPatterns("/**")
对所有请求都拦截- excludePathPatterns:用于设置不需要拦截的过滤规则
3.示例:
https://www.jb51.net/article/198236.htm
此处做一个做一个简单的拦截范例:
▶创建拦截器的:实现HandlerInterceptor接口
@Component
public class LoginInterceptor implements HandlerInterceptor {
//这里只用了两个方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行preHandle方法");
return true;
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("执行afterCompletion方法");
}
}
▶配置拦截:implements WebMvcConfigurer
/**
* 拦截器配置类
*/
@Configuration
public class WebJavaBeanConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
.excludePathPatterns("/user/logout");
}
}
▶Controller类:登录和安全退出时,不拦截,其他请求拦截
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping ("/findUserById")
public String findUserById() {
return "根据ID获取单个对象信息";
}
@PostMapping("/login")
public String login(String uname,String pwd) {
System.out.println("名字==="+uname);
System.out.println("密码==="+pwd);
return "登录成功";
}
}
执行测试:
localhost:8080/user/findUserById,执行了拦截器的方法,说明拦截成功
localhost:8080/user/login?uname=123&pwd=456,正常运行,说明拦截配置成功
关于测试接口的软件ApiPost7,刚开始下载可能不会使用,出两个图,看下接口的测试,其他功能自己学习。
创建接口:
配置一些公共的接口前缀和环境: