1.介绍
比较Java servlet过滤器和Spring MVC Handlerinterceptor,以及什么时候一个比另一个更好。
2.Filters
过滤器是web服务器的一部分,而不是Spring框架。对于传入的请求,可以使用过滤器来操作甚至阻止请求到达任何servlet。反之亦然,也可以阻止响应到达客户端。
Spring Security是使用过滤器进行身份验证和授权的一个很好的例子。配置Spring Security。只需要添加一个过滤器,即DelegatingFilterProxy。Spring Security可以拦截所有传入和传出的流量。这就是为什么Spring Security可以在Spring MVC之外使用。
2.1 创建过滤器
要创建一个过滤器,首先,创建一个实现javax.servlet.Filter接口的类:
@Component
public class LogFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(LogFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("Hello from: " + request.getLocalAddr());
chain.doFilter(request, response);
}
}
接下来,重写doFilter方法,在此可以访问或操作ServletRequest、ServletResponse或FilterChain对象。可以使用FilterChain对象允许或阻止请求。
最后,通过使用组件注解将Filter添加到Spring上下文中。剩下的就交给spring了。
3.HandlerInterceptors
处理器拦截器是Spring MVC框架的一部分,位于DispatcherServlet和我们的控制器之间。可以在请求到达控制器之前,以及视图呈现之前和之后拦截请求。
3.1 创建拦截器
为了创建Handlerinterceptor,创建了一个实现org.springframework.web.servlet.Handlerinterceptor接口的类。提供了覆盖三个方法的选项:
-
preHandle() -在调用目标处理程序之前执行
-
postHandle() -在目标处理程序之后执行,但在完成后DispatcherServlet呈现视图之前执行
-
afterCompletion() 在请求处理和视图呈现完成后的回调
- public class LogInterceptor implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(LogInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("afterCompletion"); } }
4.差异比较
过滤器在请求到达DispatcherServlet之前拦截请求,这使它们成为粗粒度任务的理想选择,如
- 身份验证
- 日志和审计
- 图像和数据压缩
- 任何想从Spring MVC中分离出来的功能
另一方面,handlerinterceppors拦截DispatcherServlet和控制器之间的请求。
这是在Spring MVC框架内完成的,提供了对Handler和ModelAndView对象的访问。这减少了重复,并允许更细粒度的功能,如:
- 处理横切关注点,如应用程序日志记录
- 详细授权检查
- 操作Spring上下文或模型
5.总结
关键的收获是使用Filters,可以在请求到达的控制器Spring MVC之外之前操作它们。否则,Handlerinterceptors是应用程序特定横切关注点的好地方。通过提供对目标Handler和ModelAndView对象的访问,拥有了更细粒度的控制