1. 掌握拦截器的使用, 及其原理

  2. 学习统一数据返回格式和统一异常处理的操作

  3. 了解一些Spring的源码

  4. 公司升级JDK要做的任务:
    升级字段要进行的任务:
    在这里插入图片描述

  5. Linux部署
    (1) 打jar包
    (2) 使用java -jar 直接运行

在pom.xml中配置这个jar包(spring-boot-maven-plugin)
在这里插入图片描述

统一功能

拦截器

  1. 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码.

在这里插入图片描述
预先设定的代码就是拦截器,你自己写的代码就是目标方法
举个例子:
在这里插入图片描述

拦截器的实现

拦截器的实现分为两步:

  1. 定义一个拦截器
  2. 把拦截器注册到项目中

(1) 定义一个拦截器:
(视图渲染我们不使用,一般是前端的工作)
在这里插入图片描述
这些函数内部可以自己实现我们的代码逻辑:
在这里插入图片描述

(2) 实现一个拦截器(给登录的逻辑添加一个拦截器)
在这里插入图片描述
某些路径不进行拦截:
在这里插入图片描述
3. 正常调用的流程:
在这里插入图片描述
使用拦截器进行调用的流程:
在这里插入图片描述
4. 前端的图片和代码也需要访问,不能够拦截,后端的登录和注册也不能拦截
5. 为什么登录功能,不进行拦截(注册也是一样的逻辑,如果注册都拦截了,新用户怎么注册)??
(1) 登录功能是用户获取身份凭证的入口,如果连登录都被拦截,系统就无法进行身份认证。
(2) 避免循环拦截

// 如果拦截器拦截登录请求
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 检查是否登录
    if (!isLogin(request)) {
        // 未登录,重定向到登录页面
        response.sendRedirect("/login");
        return false; // 拦截
    }
    return true;
}

问题:用户访问登录页面 → 拦截器检查 → 未登录 → 重定向到登录页面 → 再次触发拦截器 → 无限循环!
在这里插入图片描述
6. 使用 /** 和 /*
在这里插入图片描述

DispatcherServlet源码阅读

  1. 源码跟踪技巧:
    在阅读框架源码的时候, 一定要抓住关键点, 找到核心流程.切忌从头到尾一行一行代码去看, 一个方法的去研究, 一定要找到关键流程, 抓住关键点, 先在宏观上对整个流程或者整个原理有一个认识, 有精力再去研究其中的细节.

  2. servlet 生命周期
    (1) init
    (2) service
    (3) destroy
    在这里插入图片描述

  3. 用于初始化处理器映射器HandlerMappings,初始化处理器适配器HandlerAdapter,初始化异常处理器解析器HandlerExceptionResolver

在这里插入图片描述

总结

  1. 对上面内容的总结
    在这里插入图片描述
    在这里插入图片描述
  2. 源码阅读
    过滤器是servlet提供的,暂且不用看
    Spring源码都是以了解(通过源码,了解Spring的流程)为主(应付面试)

适配器模式

HandlerAdapter 在 Spring MVC 中使用了适配器模式

  1. 适配器模式, 也叫包装器模式. 将一个类的接口,转换成用户期望的另一个接口, 适配器让原本接口不兼容的类可以合作无间.
    简单来说就是目标类不能直接使用, 通过一个新类进行包装一下, 适配调用方使用. 把两个不兼容的接口通过一定的方式使之兼容.

在这里插入图片描述
可以通过适配器的方式, 使之兼容
在这里插入图片描述
2. 适配器模式的实现:
场景: 前面学习的slf4j 就使用了适配器模式, slf4j提供了一系列打印日志的api, 底层调用的是log4j 或者logback来打日志, 我们作为调用者, 只需要调用slf4j的api就行了。

那么Log4j 和 Slf4jApi 之间是没有关系的,但是通过了 Slf4jLog4JAdapter适配器联系了两者

/**
* slf4j接⼝
*/
interface Slf4jApi{
void log(String message);
}
/**
* log4j 接⼝
*/
class Log4j{
void log4jLog(String message){
	System.out.println("Log4j打印:"+message);
	}
}
/**
* slf4j和log4j适配器
*/
class Slf4jLog4JAdapter implements Slf4jApi{
	private Log4j log4j;
	public Slf4jLog4JAdapter(Log4j log4j) {
	this.log4j = log4j;
}
@Override
public void log(String message) {
	log4j.log4jLog(message);
}
}
/**
* 客⼾端调⽤
*/
public class Slf4jDemo {
public static void main(String[] args) {
	Slf4jApi slf4jApi = new Slf4jLog4JAdapter(new Log4j());
	slf4jApi.log("使⽤slf4j打印⽇志");
}
}

可以看出, 我们不需要改变log4j的api,只需要通过适配器转换下, 就可以更换日志框架, 保障系统的平稳运行。

适配器模式可以看作⼀种"补偿模式",用来补救设计上的缺陷。

统一数据格式返回

在这里插入图片描述
问题1:请求返回类型为Result时,不需要再进行处理了
问题2:返回结果为String时,不能正确进行处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

统一异常返回

  1. 源码看5.3.30.jar 版本的

在这里插入图片描述
2. 统一异常处理:
Spring容器在启动的时候,会进行初始化的工作,有一个是异常模块的处理,如果定义完之后,有多个异常适配的时候,ExceptionalHandler会对异常进行排序,选择最小的/最浅的进行异常处理
在这里插入图片描述

总结

  1. 对上面内容的总结:
    (1) 拦截器:作用维度是URL
    (2) 统一数据返回格式
    在这里插入图片描述
    (3) 统一异常处理
    使用的三个注解:
    在这里插入图片描述
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐