快速入门Web开发(下)(1):https://developer.aliyun.com/article/1548592
JWT
过滤器Filter
- 出现的意义是因为校验这个操作每个访问的资源页都需要出现一次且代码相同,于是使用过滤器
- 还要再启动文件中增加@ServletComponentScan来启动拦截服务
执行流程
过滤链
令牌校验
package com.example.webcase.filter; import com.alibaba.fastjson2.JSONObject; import com.example.webcase.pojo.JwtUtils; import com.example.webcase.pojo.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Slf4j @WebFilter(urlPatterns = "/*")//要拦截的请求 public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 获取请求的url来进行判断 HttpServletRequest req= (HttpServletRequest) servletRequest;//请求对象()客户端给服务器(会带令牌) HttpServletResponse resp= (HttpServletResponse) servletResponse;//响应对象 //获取url String url =req.getRequestURI(); log.info("url:{}",url); if (url.contains("login")){ log.info("登录"); filterChain.doFilter(servletRequest,servletResponse); return; } // 获取token String jwt= req.getHeader("token"); //判断token是否为空 if(!StringUtils.hasLength(jwt)){ log.info("未登入"); Result error= Result.error("NOT_LOGIN"); // 将数据转换为json格式 String notLogin= JSONObject.toJSONString(error); resp.getWriter().write(notLogin); return; } /* 校验令牌,不通过会报错*/ try{ JwtUtils.parseJWT(jwt); }catch (Exception e){ e.printStackTrace(); log.info("令牌解析失败"); /* 打印错误信息 */ Result error= Result.error("NOT_LOGIN"); String notLogin= JSONObject.toJSONString(error); resp.getWriter().write(notLogin); return; } log.info("解析成功"); filterChain.doFilter(servletRequest,servletResponse); } }
拦截器
- 拦截器
- 使用@ServletComponentScan来开启对servlet组件的使用(在启动文件位置)(开启拦截器)
全局异常处理器
- 注释二用来指定捕获异常种类
事物回滚
#spring事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug
@Transactional
事物传播
AOP
- 没有文件名的要求,只需要引用依赖后,添加 @Aspect 注释,并使用切入点表达式添加范围即可
@Aspect来标注类是aop类
- 切入点可以理解为需要增强的方法
- 使用aop后是使用基于目标对象生成的代理对象来运行
通知类型
通知顺序
通过使用@Order来控制顺序
切入点表达式
annotation
- 定义一个注解,需要切入点需要在哪里就把该方法放在切入点上面
- 该注解使用时,括号内的是定义注解的位置
连接点
- 在方法中增加一个参数即可
案列
SpringBoot原理
配置文件的优先级
Bean
- bean对象默认单列
- springboot启动的时候loc容器就已经创建了,并实例化了对象放进了容器中
第三方Bean
- 自定义的使用@Component
- 第三方使用@Bean
为什么你能进行快捷的开发?
- 起步依赖和自动配置
Maven高级
模块
- 在父工程上添加项目的原本父工程后,然后将子工程原本的父工程换为新的换成父工程
- 每个项目生成后,都会有springboot这个父工程的依赖
版本控制
方法二
聚合
Maven私服
技术栈
ngboot这个父工程的依赖
[外链图片转存中…(img-srTvanTe-1714097487488)]
版本控制
[外链图片转存中…(img-1fjrsuCB-1714097487488)]
[外链图片转存中…(img-eJyFXN7D-1714097487489)]
方法二
[外链图片转存中…(img-uG5OywVK-1714097487489)]
[外链图片转存中…(img-YILjjxyY-1714097487489)]
聚合
[外链图片转存中…(img-J4HRjBp7-1714097487490)]
[外链图片转存中…(img-Qt14Y3mp-1714097487490)]
[外链图片转存中…(img-mcc9ErXb-1714097487490)]
Maven私服
[外链图片转存中…(img-ofB5rvaA-1714097487491)]
[外链图片转存中…(img-tboNSNwu-1714097487491)]
[外链图片转存中…(img-yljPDnR6-1714097487491)]
[外链图片转存中…(img-6wo47DZR-1714097487492)]
[外链图片转存中…(img-sxoIl0nB-1714097487492)]
[外链图片转存中…(img-mtHjlikK-1714097487492)]
技术栈
[外链图片转存中…(img-oHkLu4cp-1714097487493)]
[外链图片转存中…(img-YYRYXa8W-1714097487493)]
[外链图片转存中…(img-BznHyq6r-1714097487494)]
[外链图片转存中…(img-UFAU2REN-1714097487495)]
[外链图片转存中…(img-CNQzX3FA-1714097487496)]