一. 拦截器
创建模拟登录拦截器,验证请求是否有token参数
1.1 创建拦截器
/**
* @author: hejr
* @desc: 登录拦截器
* @date: 2019/4/17 9:19
*/
@Slf4j
class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("开始拦截登录请求....");
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
response.getWriter().println("not found token");
return false;
}
return true;
}
}
1.2 注册拦截器
/**
* @author: hejr
* @desc: 注册拦截器
* @date: 2019/4/17 9:21
*/
@Configuration
class WebMvcConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor();
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
}
/**
* 拦截所有请求,除了登录,首页,错误页面
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","user/login","/index.html","/error.html")
.excludePathPatterns("/public/**","/resources/**");
}
/**
* 静态资源目录放开
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**","/public/**")
.addResourceLocations("classpath:/resources/","classpath:/public/");
}
}
1.3 拦截演示
浏览器输入地址:http://localhost:8800/user/findUserList
返回结果:not found token
加上token条件:http://localhost:8800/user/findUserList?token=SDFSDFSD
返回真实结果!!!!
二. 拦截器与过滤器的区别
拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层通过动态代理模式完成。
(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
(3)拦截器只能对Controller请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)在Controller的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
过滤器应用场景:设置编码字符、过滤铭感字符
拦截器应用场景:拦截未登陆用户、审计日志()
三. 源码下载
https://gitee.com/hejr.cn.com/SpringBoot2.0_2019/tree/master/springboot2_11_interceptor