登录-AOP-高级maven

基础登录功能

简单登录功能的开发:注意从接口文档得出前端传递的数据是什么类型,前端传递的数据是json,json数据必须要实体类接收
@RequestBody @PathV 这几个注解熟悉一下

登录校验

http是无状态的,如何实现登录校验呢
对请求进行统一拦截,获取登录标记,标记正常放行请求,标记有问题则自动跳转到登录界面

登录标记--会话技术
统一拦截--filter Interceptor

会话技术

会话跟踪:识别多个请求是否来自于同个浏览器,以便在同一次会话的多次请求间共享数据(有跟踪就有劫持)
会话跟踪方案:Cookie Session 令牌技术

Cookie
为什么cookie不能跨域
Session
创建一个会话对象session,服务器将session的ID通过set-cookie响应给浏览器
浏览器会自动存储在本地,在每次请求服务器时都会以cookie的形式携带到服务端
服务器会从从众多session中找到这个id的ssession

弊端之一:集群环境下无法使用这种session的方式

令牌技术
用户登录完成后生成JWT令牌,
返回给客户端,客户端每次访问都会将请求携带到服务端
统一拦截,进行校验

JWT令牌

令牌的生成和解析
JSON Web Token
简洁、自包含
JWT令牌的组成:头、有效载荷、签名

step1:生成JWT令牌,返回给前端(也就是客户端)
step2:拦截所有请求,校验令牌的有效性
如果随意的偷别人的jwt令牌,请求时设为token字段不就实现了冒充访问的功能吗

过滤器Filter

JavaWeb三大组件之一:Servlet,Filter,Listener

等于把通用的登录校验功能统一实现在过滤器中
定义:实现dofilter方法
配置:@WebFilter @ServletComponentScan

执行流程:请求 -->放行前逻辑 -->放行 -->资源 -->放行后逻辑
过滤器的优先级按照、过滤器类名的自然排序

登录校验实例
fastjson:将其他对象转换为json格式并返回

拦截器Interceptor

定义拦截器,实现HandlerInterceptor接口,并重写所有的方法+配置拦截器

拦截路径:与过滤器不一样,/*表示1级路径,/**表示任意级路径

执行流程

异常处理
出现异常时返回的json不符合开发规范
定义全局异常处理器@RestControllerAdvice @ExceptionHandler

AOP

事务

事务是一组操作的集合,要么同时成功要么同时失败
@Transactional将当前方法交给spring进行事务管理
位置:业务层的方法、类、接口上

事务进阶
rollbackfor指定出现什么样的异常会回滚事务,默认的是只有出现RuntimeException才回滚异常
propagation:事务的传播行为,默认值required,如果有事务加入到已存在的事务,没有事务则新建个事务
传播行为主要两种:required和requires_new(不希望事务之间相互影响,将旧事务挂起开始一个新的事务)

学习看日志,下载了个日志插件grep

AOP基础

aspect oriented programming面向切面编程
主要通过动态代理模式实现
aop的场景:记录操作日志,权限控制,事务管理(底层也是应用场景)
优势:代码无侵入,减少重复代码,
理解:是针对特定方法(根据业务需求进行)的编程

连接点,切入点,通知,切面,目标对象
一旦进行了AOP开发,最终运行的对象都是基于目标对象生成的代理对象

AOP进阶

通知类型

五种通知类型:after,before,around,afterreturning,afterthrowing
@pointcut注解,将公共的切入点表达式抽取出来,private(只在当前切面类)

通知顺序

不同的切面类默认按照切面类的类名字母排序
可以用order注解来控制顺序

切入点表达式

决定项目中哪些方法需要加入通知
execution切入点表达式:
演示了一些切入点表达式的写法
访问修饰符可以省略,包名.类名可以省略,抛出异常可以省略
通配符:*与..

annotation切入点表达式

连接点

在spring中抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等

案例

配置aop起步依赖

在controller层切入??

SpringBoot原理

配置优先级

properties>yml>yaml
SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置

命令行参数是最强一环,其次是 -D。用对它们,你就可以在“最后一秒”改掉任何 Spring Boot 配置,而完全不用触碰代码或配置文件。
命令行参数>java系统属性>properties文件>yml>yaml

bean管理

默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:根据name,根据类型,根据name和类型获取
bean的作用域:singleton(单例,默认),prototype(非单例)
默认singleton的bean,在容器启动时被创建,可以使用@Lazy延迟初始化(延迟到第一次使用时)
prototype的bean每一次使用时都会创建一个新的实例对象
实际开放中绝大部分的bean都是单例的
第三方bean 需要用到第三方的bean对象,可以通过value或者name属性指定bean的名字,但一般都是方法名

当类在第三方 JAR 里时,才需要 @Bean(无法修改别人的源码,只能在自己项目中手动构造并返回)

springboot原理

spring framework--->springboot
起步依赖:maven的依赖传递
自动配置:当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发

自动配置的原理:在引入依赖后如何将依赖Jar包中提供的bean以及配置类加载到ioc容器中
maven导入pom.xml有点不理解
方案1:ComponentScan
方案2:@import导入 导入配置类,导入普通类,导入importselector接口实现类 @EnableXxx注解,封装@Import注解

源码追踪
主程序的注解@SpringBootApplication 底层封装有
@SpringBootConfiguration 封装注解@configuration,声明是配置类
@EnableAutoConfiguration 封装注解@import 封装ImportSelector接口实现类,返回最终需要将哪些类交给ioc容器管理 读取两份配置文件 根据@conditional注解觉得这个类是否进行装配
进行条件装配@Conditional注解

自定义starter起步依赖
文件上传的流程?仿佛失忆了

在autoconfigure模块集成原有的代码 scan扫描不到了,所有的component失效了,利用@EnableConfigurationProperties(AliOSSProperties.class)注入AliOSSProperties类
第三方包(非自定义) 配置类+@bean实现将交给ioc容器管理

@Configuration //配置类
@EnableConfigurationProperties(AliOSSProperties.class) //import将aliproperties导入ioc容器中成为bean
public class AliOSSAutoConfiguratin {

    @Bean
    public AliOSSUtils suibian(AliOSSProperties aliOSSProperties){//第三方bean,依赖其他bean对象直接设置形参即可
        AliOSSUtils aliOSSUtils = new AliOSSUtils();
        aliOSSUtils.setAliOSSProperties(aliOSSProperties);
        return aliOSSUtils;

    }

}

spring framework中的web开发模块又称为springmvc框架

maven高级

分模块设计与开发

将项目按照功能拆分成若干个子模块,例如utils和pojo类可以分出来

maven继承

继承关系
子工程可以继承父工程中的配置信息,常用于依赖关系的继承
maven中的三种打包方式:pom,jar,war
spring-boot-starter --> 父工程 -->子工程

在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的
relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)

版本锁定
在父工程的pom文件中通过来统一管理依赖版本
是配置依赖,父工程中配置了依赖,子工程中会继承下来
统一管理依赖版本,父工程设置了版本,子工程还需要引入该依赖,但是不用再设置版本号

maven聚合

快速构建项目 通过modules设置当前包含的子模块的名称

补充

@Bean和@Component

@Component 自己定义的服务类、DAO 类、控制器类
用于类上,表示这个类是一个 Spring 组件,Spring 会自动将其实例化并注册为 Bean。
通常与 组件扫描(@ComponentScan)配合使用。
@Bean 创建第三方库中的对象,不能在类上添加注解时
用于方法上,该方法的返回值将被注册为一个 Bean。
一般定义在一个标注了 @Configuration 的配置类中。

注入方式三种

属性注入
构造函数注入:只有一个构造函数时,@autowired注解可以省略
set函数注入

posted @ 2025-04-16 19:37  huhulahu  阅读(38)  评论(0)    收藏  举报