第 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 的麻烦:
对于 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:从入门到项目实战》
《学透 Spring:从入门到项目实战》
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论