理论总是枯燥的,更多的是要尝试自己去理解,把代码敲出来
jwt:编写工具类设置头,载荷和过期时间,登录成功后生成一个JWT令牌进行比对
比对成功则放行
失败则抛出错误信息
Filter有3个阶段,分别是初始化,拦截和过滤,销毁。
初始化阶段:当服务器启动时,我们的服务器(Tomcat)就会读取配置文件,扫描注解,然后来创建我们的Filter。
拦截和过滤阶段:只要请求资源的路径和拦截的路径相同,那么过滤器就会对请求进行过滤,这个阶段在服务器运行过程中会一直循环。
销毁阶段:当服务器(Tomcat)关闭时,服务器创建的Filter也会随之销毁。
Filter拦截路径:@WebFilter(urlPatterns="/*"
拦截具体路径 /login 只有访问/login路径时,才会被拦截
目录拦截 /emps/*(不一定非得是emps,输入任何路径都能执行拦截) 访问/emps/*下的所有资源,都会拦截
拦截所有 /* 访问所有资源,都会被拦截
过滤器链:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
先执行类名靠前的放行前逻辑,然后放行,再执行靠后的过滤器逻辑再放行,当请求到达web资源之后返回来先执行类名靠后的放行后逻辑,再执行靠前的放行后逻辑
登录校验:流程
获取请求url
判断请求url中是否包含login,如果包含,说明是登陆操作,放行
获取请求头中的令牌(token)
判断令牌是否存在,如果不存在,返回错误结果(未登录)
解析token令牌,如果解析失败,返回错误结果(未登录)
放行
Interceptor拦截器
拦截器概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行
作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码
拦截路径 含义 举例
/* 一级路径 能匹配/depts,/emps,不能匹配/depts/1
/** 任意级路径 能匹配/depts,/depts/1也就是任意一级路径
/depts/* 可以匹配/depts的下一级路径 能匹配/depts/1,不能匹配/depts/1/2,不能匹配/depts
/depts/** /depts的任意级路径 能匹配/depts/1/2,不能匹配/emps/1
过滤器和拦截器的区别
接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截spring中的资源
全局异常处理器
编写一个类,在类名上添加@RestControllerAdvice,在方法名上添加@ExceptionHandler注解,并填写Exception.class,
编写ex.pringStackTrace方法即可捕获全局异常
Spring事务管理
spring中的事务应该保持一致性,要么全部成功,要么全部回滚
@Transactional注解,添加到service层的类上,方法上,接口上(一般情况都是加在执行增删改的方法上)
作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
同时可以在配置文件中添加spring的事务管理日志
事务属性-传播行为
REQUIRED:大部分情况下都是用该传播行为即可。
REQUIRES_NEW:当我们不希望事务之间互相影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。
AOP:Aspect Oriented Programming(面向切面编程,面向方面编程),其实就是面向特定方法编程。在不改动原始方法的情况下进行编程,也是一种编程思想,
他允许开发者将横切关注点(如日志记录,事务管理)等从业务逻辑分离,提高代码的模块化和可维护性
核心概念:
连接点:joinpoint可以被AOP控制的方法(暗含方法执行时的相关信息)
通知:advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)
切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
切面:aspect,描述通知与切入点的对应关系(通知+切入点)
目标对象:Target,通知 所应用的对象
执行顺序
1.
不同切面类中,默认按照切面类的类名字母排序
目标方法前的通知方法:字母排名靠前的先执行
目标方法后的通知方法:字母排名靠前的后执行
2.用@order(数字)加在切面类上来控制顺序
目标方法前的通知方法:数字小的先执行
目标方法后的通知方法:数字小的后执行
AOP切面表达式两种方法
1.execution(修饰符?返回值 包名.类名?方法名(参数)throws 异常?)
2.@annotation(注解全类名)
第一种方法在类名开头一致时使用,建议同类型方法开头一致,如查找方法都以find开头,修改都以update开头