第一次做项目笔记涉及到的知识比较浅
自己学习模仿b站一位up主的第一个前后端分离的博客项目的笔记,如有不对请指正(源项目地址:GitHub - MarkerHub/vueblog: 一个前后端分离的简单博客案例,适合刚入门vue,学前后端分离的童鞋!)
学习得到的知识:
CodeGenerator代码生成器
一、数据库表必须有主键(唯一,整型,自增)
二、只能在Windows系统上运行程序(路径问题)
了解到了序列化,Serializable接口相当于一个标记,被JVM虚拟机识别将Java对象转换为字节序列,序列化的核心作用就是对象状态的保存和重建。当然,同时也存在反序列化。
session和redis关系:当数据过多是采用redis储存,而不采用session。session多进程之间的数据无法共享。例如当使用第一个进程登陆时,登录信息储存在第一个进程中,如果你使用第二个进程登陆就会失败。session和redis关系_阿锋不知道丶的博客-CSDN博客_session和redis这样也就实现了三种的会话共享。
redis:web serversion最长远的缓存数据库,但是数据是存放在内存中的,相比于mysql起来,访问速度块,当时成本高,可存的数据量小
引入依赖Hibernate validatior,使用注解NotBlank(message = "xx")来校验实体
异常处理的方法:Result结果封装,GlobalExceptionHandler捕获异常
跨域问题:何谓同源:URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示它们同源。浏览器的同源策略,从一个域上加载的脚本不允许访问另外一个域的文档属性 ,是浏览器上为安全性考虑实施的非常重要的安全策略。
用CodeGenerator代码生成器非常方便,直接生成Controller、Entity、mapper、service
整个项目创建了一个Result类用于结果封装,返回一些成功失败的信息
可以通过多次重写返回成功失败信息的函数,succ()、fail()来适应不同情况下信息的返回。
这个类的话与后面的一个类GlobalExceptionHandler全局捕获异常结合非常完美。两个类直接实现了整个项目错误的返回。
项目中为了简化开发,使用了jwt的工具包和hutool工具包
redis用来做一个容器,shiro来校验用户信息
在ShiroConfig类中的DefaultWebSecurityManager函数关闭了shiro自带的session方式,这里将用户的信息存储到redis中,禁止用户通过session方式登录,而是通过jwt凭证登录
AccountRealm:shiro进行登录或者权限校验的逻辑所在,在这里重写它的父类AuthorizingRealm的三个方法 supports:让realm支持jwt的凭证校验 doGetAuthorizationInfo:权限校验 doGetAuthenticationInfo:登录认证校验 其实主要就是doGetAuthenticationInfo登录认证这个方法,可以看到我们通过jwt获取到用户信息,判断用户的状态,最后异常就抛出对应的异常信息,否者封装成SimpleAuthenticationInfo返回给shiro。
AccountProfile是为了登录成功之后但会的一个用户信息的载体
jwt的过滤器JwtFilter,在这个项目中继承的是Shiro内置的AuthenticatingFilter我们需要重写几个方法:
createToken:实现登录,我们需要生成我们自定义支持的JwtToken
onAccessDenied:拦截校验,当头部没有Authorization时候,我们直接通过,不需要自动登录;当带有的时候,首先我们校验jwt的有效性,没问题我们就直接执行executeLogin方法实现自动登录
onLoginFailure:登录异常时候进入的方法,我们直接把异常信息封装然后抛出
CorsConfig:拦截器的前置拦截,因为我们是前后端分析项目,项目中除了需要跨域全局配置之外,我们再拦截器中也需要提供跨域支持。这样,拦截器才不会在进入Controller之前就被限制了。
到这里,整合Shiro和jwt已经结束了,整个项目中这一部分是我写的最迷惑,花费时间最多的一部分,这一部分中涉及了一些没有听说过的东西,一些代码写出来也仅仅只是了解功能,却不理解它的运行原理,这一部分还需要继续学习
这里我们做一个全局异常捕获类,如果不配置这个类,服务器出错的时候返回的信息不能显示什么,所以捕获各种各样的异常来返回给前端
上面我们捕捉了几个异常:
ShiroException:shiro抛出的异常,比如没有权限,用户登录异常
IllegalArgumentException:处理Assert的异常
MethodArgumentNotValidException:处理实体校验的异常
RuntimeException:捕捉其他异常
做表单数据提交的时候,对于数据的校验,在后端我们可以借助springboot框架集成的Hibernate validatior来做校验
导入依赖Hibernate validatior
添加到实体上的:
@NotBlank(message = "xxxxx")
@Email(message = "xxxxx")
使用注解@Validated注解方式,如果实体不符合要求,系统抛出异常,就会被GlobalExceptionHandler捕获到,属于MethodArgumentNotValidException异常
一个固定的模板
UserController
登录的逻辑其实很简单,只需要接受账号密码,然后把用户的id生成jwt,返回给前段,为了后续的jwt的延期,所以我们把jwt放在header上。
BlogController
添加@RequiresAuthentication注解说明需要登录之后才能访问