前言
Spring 已经是我们 Java Web 开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率。同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规范,但因其体系庞大、设计复杂对于刚开始阅读源码的人来说是非常困难的。所以在此之前首先你得下定决心,不管有多困难都得坚持下去;其次,最好先把设计模式掌握熟练;然后在开始阅读源码时一定要多画 UML 类图和时序图,多问自己为什么要这么设计?这样设计的好处是什么?还有没有更好的设计?当然,晕车是难免的,但还是那句话,一定要持之以恒
-
onLoginFailure:登录异常时候进入的方法,我们直接把异常信息封装然后抛出
-
preHandle:拦截器的前置拦截,因为我们是前后端分析项目,项目中除了需要跨域全局配置之外,我们在拦截器中也需要提供跨域支持。这样,拦截器才不会在进入 Controller 之前就被限制了。
下面我们看看总体的代码:
-
com.markerhub.shiro.JwtFilter
那么到这里,我们的 shiro 就已经完成整合进来了,并且使用了 jwt 进行身份校验。
5、异常处理
======
有时候不可避免服务器报错的情况,如果不配置异常处理机制,就会默认返回 tomcat 或者 nginx 的 5XX 页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端。
处理办法如下:通过使用 @ControllerAdvice 来进行统一异常处理,@ExceptionHandler(value = RuntimeException.class)来指定捕获的 Exception 各个类型异常 ,这个异常的处理,是全局的,所有类似的异常,都会跑到这个地方处理。
-
com.markerhub.common.exception.GlobalExceptionHandler
步骤二、定义全局异常处理,@ControllerAdvice 表示定义全局控制器异常处理,@ExceptionHandler 表示针对性异常处理,可对每种异常针对性处理。
上面我们捕捉了几个异常:
-
ShiroException:shiro 抛出的异常,比如没有权限,用户登录异常
-
IllegalArgumentException:处理 Assert 的异常
-
MethodArgumentNotValidException:处理实体校验的异常
-
RuntimeException:捕捉其他异常
6、实体校验
======
当我们表单数据提交的时候,前端的校验我们可以使用一些类似于 jQuery Validate 等 js 插件实现,而后端我们可以使用 Hibernate validatior 来做校验。
我们使用 springboot 框架作为基础,那么就已经自动集成了 Hibernate validatior。
那么用起来啥样子的呢?
第一步:首先在实体的属性上添加对应的校验规则,比如:
第二步 :这里我们使用 @Validated 注解方式,如果实体不符合要求,系统会抛出异常,那么我们的异常处理中就捕获到
MethodArgumentNotValidException。
-
com.markerhub.controller.UserController
7、跨域问题
======
因为是前后端分析,所以跨域问题是避免不了的,我们直接在后台进行全局跨域处理:
-
com.markerhub.config.CorsConfig
ok,因为我们系统开发的接口比较简单,所以我就不集成 swagger2 了,也比较简单而已。下面我们就直接进入我们的正题,进行编写登录接口。
8、登录接口开发
========
登录的逻辑其实很简答,只需要接受账号密码,然后把用户的 id 生成 jwt,返回给前段,为了后续的 jwt 的延期,所以我们把 jwt 放在 header 上。具体代码如下:
-
com.markerhub.controller.AccountController