学透 Spring:从入门到项目实战
丁雪丰
美团研究员
1073 人已学习
立即订阅
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
时长 07:11
时长 15:51
时长 00:10
时长 02:03
时长 00:39
学透 Spring:从入门到项目实战
15
15
1.0x
00:00/00:00
登录|注册

第 11 章 Web 开发进阶(1)

本章内容
Spring MVC 中实现 AOP 与异常处理的方式
Spring Boot 内嵌 Web 容器的配置方法
分布式 Session 的实现方案与 Spring Session 的基本用法
WebFlux 及 WebClient 的基本用法
开发 Web 项目过程中除了完成基本的需求,总会有些非功能性的需求,例如:统一用日志记录所有的请求;使用一个集群对外提供服务时,要在集群中保持会话状态;使用 HTTP/2 提供更安全高效的服务,等等。基于 Spring 提供的一系列框架能够满足我们项目中的各种需求吗?在这一章里就让我们一起来了解一下。

11.1 在 Spring MVC 中实现 AOP

在第 3 章中,我们大致了解了 AOP 相关的知识,以及如何在基于 Spring Framework 的项目中开发自己的 AOP 代码,那么在一个 Web 项目里,又该怎么通过 AOP 实现一些通用的功能呢?最直观的做法是参考第 3 章介绍的内容,直接拦截 @Controller 类里的方法,但这样做可能会丢失 HTTP 请求中的部分细节(比如,假设方法的参数里没有 HttpServletRequest,就无法在 AOP 里拿到请求)。Spring MVC 自然也考虑到了 Web 项目中存在类似的需求,提供了解决方案。

11.1.1 使用 HandlerInterceptor 实现 AOP

Spring MVC 的 HandlerInterceptor 接口为我们定义了几个拦截的切入点:
preHandle(),在处理器开始处理前介入,类似于带有 @Before 注解的前置通知。返回 true 表示可以继续处理,返回 false 则会中断后续的处理;
postHandle(),在处理器处理结束但尚未进行视图呈现时介入,可以修改 ModelMap 或者 ModelAndView 里的内容;
afterCompletion(),在完成视图呈现后介入,可以用来做些资源清理的工作。
这个接口从 2003 年就出现在 Spring MVC 里了,不过随着 Java 版本的发展,接口的定义虽然没有变化,但增加了默认实现,省去了实现类继承 HandlerInterceptorAdapter 的麻烦:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView)throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
对于 Servlet 3.0 后增加的异步请求,请求开始处理后就返回了,真正的处理逻辑在另一个线程里继续,我们还拿不到结果,正因如此,DispatcherServlet 并不会调用 postHandler()afterCompletion()。这时可以用 AsyncHandlerInterceptor,启动处理后会调用 afterConcurrentHandlingStarted(),待处理结束又会分发回 Servlet 容器里,调用 preHandle()postHandle()afterCompletion()。在这几个方法里,我们该怎么区分请求到底是同步的还是异步的呢?Servlet 3.0 自然也提供了判断方法:调用 ServletRequest.getDispatcherType(),根据返回的枚举值判断。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了在 Web 开发中使用 Spring 框架解决非功能性需求的方法。首先讨论了在 Spring MVC 中实现 AOP 的方式,介绍了使用 HandlerInterceptor 接口实现 AOP 的方法,并给出了具体的代码示例。其次,通过二进制奶茶店的程序为例,说明了如何通过 AOP 实现日志记录和审计功能,包括对请求处理过程中的关键信息进行记录和处理。文章还介绍了在 Spring MVC 中使用 @ExceptionHandler 的方法,以及如何通过异常处理的功能为二进制奶茶店优化用户体验。通过具体的代码示例和实际应用场景,读者可以了解如何在控制器类中使用 @ExceptionHandler 注解的方法,以及方法的参数类型和返回值类型的灵活性。同时,文章还介绍了如何通过拦截器实现对请求的拦截和处理,以及如何返回友好的提示信息。总的来说,本文通过具体的代码示例和实际应用场景,详细介绍了在 Spring 框架中实现 AOP、日志记录、审计功能以及异常处理的方法,对于正在进行 Web 开发的读者来说,是一篇具有实际指导意义的技术文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《学透 Spring:从入门到项目实战》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部