叠甲
自己查询答案的时候总结的说法,仅供参考,轻喷...
面试时...
- 面试官:拦截器你是如何实现的?
- 我:...呃...在SpringCloud中主要是使用了Zuul框架,Zuul框架主要作用与网关层,在这里可以做鉴权等等的一些操作
- 面试官:嗯...好
解答方法
我们配置拦截器主要分两步,定义拦截器以及注册拦截器
定义拦截器
- 首先我会定义一个拦截器的类,让其加上@Component注解,以及让其实现HandlerInterceptor接口
- 此时会出现3个重写方法preHandler,postHandler,afterCompletion,接着我会在preHanlder中添加鉴权等操作
@Component
public class CustomerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception {
System.out.println("CustomerInterceptor 目标方法执行前执行..");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("CustomerInterceptor 目标方法执行后执行");
}
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("CustomerInterceptor 视图渲染完毕后执行,最后执行");
}
}
注册拦截器
- 这个时候我们只是定义了一个拦截器,接着我们需要将其注册到Spring框架中
- 创建一个Config的类,加上Configuration的注解,让其实现WebMvcConfigurer接口
- 然后在上面注册CustomerInterceptor,并制定好拦截器的请求路径
@Configuration
public class WebConfig implements WebMvcConfigurer {
//⾃定义的拦截器对象
@Autowired
private CustomerInterceptor customerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册⾃定义拦截器对象
registry.addInterceptor(customerInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
}
}
知识点解释
@Component
@Component的类似于@Controller、@Service的父级,定义了这个的类会在启动时被@ComponentScan扫描并注册到Spring中
HandlerInterceptor
定义拦截器的时候,需要继承此接口才能使用
@Configuration
@Configuration是@Bean中的一种注解,在项目启动时会注册实例到IOC容器中,从而达到启动即运行的效果
WebMvcConfigurer
此接口主要提供了添加拦截器的方法,搭配@Configuration能够实现拦截器