Spring MVC中的HandlerInterceptors和Filters

news/2025/3/16 18:47:03/

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);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.info("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.info("postHandle");}@Overridepublic 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对象的访问,拥有了更细粒度的控制


http://www.ppmy.cn/news/813686.html

相关文章

西部数据携全线产品亮相IDF 2014

存储行业的领导者 西部数据 作为英特尔信息技术峰会(简称IDF)的常年合作伙伴,携全线高性能存储产品与高科技解决方案隆重亮相IDF 2014,向各方与会者、及行业伙伴展示了包括消费级桌面系列、企业级与安防监控系列、应用于超级本的超…

常规机械硬盘分类应用场景与硬盘接口存储方案介绍

0x00 简述0x01 硬盘类型 1.西部数据(WD)2.希捷(seagate)0x02 硬盘接口 1.硬盘接口类型2.硬盘接口协议3.磁盘存储方案0x00 简述 描述:简要介绍磁盘实现原理以及购买磁盘商的选择对比以及其产品线了解,其后对磁盘接口及其常使用的协议做了一个简单的了解,并且对其使用场景作了一…

【Linux云计算架构:第一阶段-Linux操作系统入门到精通】第12章——硬盘介绍和磁盘管理

本节所讲内容: 12.1 SAS-SATA-SSD-SCSI-IDE硬盘讲解 12.2 磁盘分区工具和挂载 12.3 实战扩展swap分区 12.1 SAS-SATA-SSD-SCSI-IDE硬盘讲解 常见磁盘类型: •SAS硬盘(希捷:ST)•SATA硬盘(西部数据:WD,个人…

Qt:记录一下好看的配色

qss代码 窗体背景色 background-color: #ED6927; border-top-left-radius:35px;border-top-right-radius:35px;border-bottom-right-radius:0px; border-bottom-left-radius:0px;background-color: #203A32; border-radius:35px; border-top-left-radius:0px;border-top-righ…

【Java】面向对象基础 之构造方法

一、 构造方法 创建实例的时候,我们经常需要同时初始化这个实例的字段,例如: Person ming new Person(); ming.setName("小明"); ming.setAge(12);初始化对象实例需要3行代码,而且,如果忘了调用setName()…

为什么“应该从XP升级到Win7”

新旧交替乃是自然规律,唯有一断创新才能带来进步。而对日新月异的软硬件发展与用户对于电脑使用方式与需求的变化,步入暮年的Windows XP在安全、稳定性以及易用性方面已经无法带给用户更好的体验。 2014年4月8日,微软终止对Windows XP的支持服…

python对电脑要求高吗-学python最电脑配置有要求么

python对于电脑硬件基本没什么要求,下载python安装程序的时候,注意看下自己电脑属性是64位系统还是32位系统,再下载对应的python安装程序。 单纯学Python的话普通电脑就ok了,机器学习几大基础算法都ok,学深度学习的话…

命名管道使用示例

用命名管道实现client和server端进行通信 【实现步骤】 创建两个没有关系的进程--》编写client和server源文件,并分别编译成可执行程序;创建命名管道文件,用函数int mkfifo(const char *filename,mode_t mode);client端以写的方式打开管道文…