WHCSRL 技术网

springboot+vue前后端分离博客项目(后端笔记)

第一次做项目笔记涉及到的知识比较浅

自己学习模仿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的协议、域名和端口相同,则表示它们同源。浏览器的同源策略,从一个域上加载的脚本不允许访问另外一个域的文档属性 ,是浏览器上为安全性考虑实施的非常重要的安全策略。

一、整合MybatisPlus

用CodeGenerator代码生成器非常方便,直接生成Controller、Entity、mapper、service

二、统一结果封装

整个项目创建了一个Result类用于结果封装,返回一些成功失败的信息

可以通过多次重写返回成功失败信息的函数,succ()、fail()来适应不同情况下信息的返回。

这个类的话与后面的一个类GlobalExceptionHandler全局捕获异常结合非常完美。两个类直接实现了整个项目错误的返回。

三、整合shiro+jwt,并会话共享

项目中为了简化开发,使用了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我们需要重写几个方法:

  1. createToken:实现登录,我们需要生成我们自定义支持的JwtToken

  2. onAccessDenied:拦截校验,当头部没有Authorization时候,我们直接通过,不需要自动登录;当带有的时候,首先我们校验jwt的有效性,没问题我们就直接执行executeLogin方法实现自动登录

  3. onLoginFailure:登录异常时候进入的方法,我们直接把异常信息封装然后抛出

  4. 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注解说明需要登录之后才能访问

推荐阅读