Java面试题目记录——拦截器如何实现

46 阅读2分钟

叠甲

自己查询答案的时候总结的说法,仅供参考,轻喷...

面试时...

  • 面试官:拦截器你是如何实现的?
  • 我:...呃...在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能够实现拦截器