Spring 面试题, Spring MVC 中的拦截器是什么?如何定义一个拦截器?
Spring 面试题, Spring MVC 中的拦截器是什么?如何定义一个拦截器?
QA
Step 1
Q:: 什么是Spring MVC中的拦截器?
A:: Spring MVC中的拦截器(Interceptor)是一种面向切面的编程方法,它允许开发者在请求的不同阶段执行自定义逻辑。拦截器类似于Servlet的过滤器,但其功能更加强大,可以对处理器进行预处理(preHandle)、后处理(postHandle)以及整个请求完成后的处理(afterCompletion)。拦截器主要用于权限验证、日志记录、请求参数处理等场景。
Step 2
Q:: 如何定义一个Spring MVC拦截器?
A:: 定义一个Spring MVC拦截器通常涉及以下步骤:
1.
创建一个类实现HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类。
2.
重写该接口中的三个方法:preHandle
、postHandle
、afterCompletion
。
-
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)``:
在请求被处理之前调用,可以用于权限验证或请求日志记录。
-
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)``:
在处理器处理完请求,但在视图渲染之前调用,可以修改ModelAndView对象。
-
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)``:
在整个请求完成后调用,可以用于清理资源或记录结束日志。
3.
在Spring配置文件中或通过@Configuration
类配置拦截器,使用InterceptorRegistry
类将拦截器注册到应用中。
Step 3
Q:: 拦截器和过滤器有什么区别?
A:: 拦截器和过滤器都是用于对HTTP请求进行预处理和后处理的机制,但它们有不同的应用场景和功能。
-
过滤器(Filter)是Servlet规范的一部分,作用于Servlet容器级别,能够对几乎所有的请求和响应进行处理,可以用于日志记录、字符编码设置、压缩响应等。
-
拦截器(Interceptor)是Spring MVC框架的一部分,作用于Spring的处理器链中,提供更细粒度的控制,适用于控制器层面的业务逻辑处理,如权限控制、数据验证等。
总体来说,拦截器的功能更强大且与Spring框架集成更紧密,而过滤器更通用且与Web容器紧密相关。