
这是万物可述的第16篇原创文章
开发指南
01
项目搭建:
准备好环境jdk1.8,maven3.3.9
配置阿里云的maven镜像
SVN 下载:svn://47.92.118.168/南洋商业银行数据湖/code/typlatform-source/typlatform
导入ide(eclipse或者IDEA),选择maven项目导入
执行sql(需要本地数据库)
运行(main方法运行 jar包方式运行 war包方式运行--tomcat)
mvncleanpackage -Dmaven.test.skip=true
02
项目说明:

typlatform 模块:为其他所有模块的父模块,主要功能是管理项目中所有用到的jar,以及聚合其他模块配置
typlatform-core 模块为抽象出的核心(通用)模块,以供其他模块调用,此模块主要封装了一些通用的工具类,公共枚举,常量,配置等等
typlatform-sjh 是数据湖的业务的模块

03
快速发开业务(增删改查)
准备数据库表(表及字段需要详细注释)
利用代码生成器,生成表对应的实体和数据库操作DAO,等及业务的基本代码
在此基础开发复杂业务功能
技术分享
项目的基础框架设计图


项目的基础框架说明
基于springboot + apache shiro + mybatis框架,mybatis-plus ,restful风格api,json-web-token,druid数据库连接池,swagger文档生成,redis存储refreshtoken和动态秘钥,maven,MD5单向加密和AES双向等。
一个nginx作为反向代理服务器,解决了跨域,真实IP头(现服务器端支持跨域可 不用nginx)。另一个nginx作为vue应用服务器,tomcat作为后端的服务器。
MyBatis-Plus
mybatis在项目开发时候要写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,server以下代码可以一键生成,基本不需修改
资料:
官网地址:https://mp.baomidou.com/#/
MyBatis-Plus 入门视频
https://www.imooc.com/learn/1130
MyBatis-Plus 进阶视频
https://www.imooc.com/learn/1171
MyBatis-Plus 实例
https://gitee.com/baomidou/mybatis-plus-samples
基于springboot + apache shiro + mybatis框架,mybatis-plus ,restful风格api,json-web-token,druid数据库连接池,swagger文档生成,redis存储refreshtoken和动态秘钥,maven,MD5单向加密和AES双向等。
一个nginx作为反向代理服务器,解决了跨域,真实IP头(现服务器端支持跨域可不用nginx)。另一个nginx作为vue应用服务器,tomcat作为后端的服务器。
代码生成器的思想
代码生成器作用? 开发新业务时,生成重复代码,减少工作量
代码生成器原理? 模板+变量=代码
如何制作自己的代码生成器? 使用模板引擎(freemarker)
Springboot的条件注入
常用的注解使用方式:
@ConditionalOnBean
@ConditionalOnMissingBean
@ConditionalOnClass
@ConditionalOnMissingClass
@ConditionalOnProperty
@ConditionalOnExpression
例子:https://blog.csdn.net/liuyueyi25/article/details/83244279
多数据源实现:
1.新建一个注解类DataSource
2.拓展一个AbstractRoutingDataSource并重写determineCurrentLookupKey方法( DynamicDataSource 类)
3.配置这个拓展类到spring容器
4.编写多数据源切换的AOP
5.在需要切换数据源的service层方法加上注解@DataSource(name=“xxx”)即可
分页功能的实现:
利用mybatis-plus的分页插件实现分页
如何使用:
1.封装一个PageFactory ,利用PageFactory类创建Page类
2.利用Page类进行分页查询
map+warpper 思想及实现:
概念:map+warpper方式即把controller层的返回结果转化成map,利用Warpper类做一次包装,使得返回给前端的结果更加显示灵活(显示数据灵活,维护灵活)。
原理:BaseControllerWarpper类
使用方法:继承BaseControllerWarpper类,编写自己的warpper类
User(id,name,sex)
Map(id,name,sex,sexName,email,birthday) map.put(“email”,xxx)
全局异常拦截器思想:
全局异常拦截器可以做什么? 拦截程序运行中的已知和未知异常
为什么要配置全局异常拦截器? 增加程序的健壮性
如何实现? @ControllerAdvice注解



Jwt的介绍
Jwt简介:
Jwt是一种用户授权机制,jwt由服务器端产生,当客户端拥有jwt之后,就相当于客户端拥有了访问服务器资源的权限,jwt由三部分组成,第一部分头部( header),第二部分载荷(payload),第三部分是签证( signature).
Jwt的样子:
xxxx. xxxx. xxxx
header:声明类型(jwt) ,声明加密的算法(HS256),json经过base64编码
payload:存放有效信息,json经过base64编码
signature:存放签证信息,由header和payload分别base64编码后,并拼接秘钥串(secret),再进行加密生成
Header base64.payload base64 + secret
Jwt参考资料:
http://www.jianshu.com/p/576dbf44b2ae
http://blog.rainy.im/2015/06/10/react-jwt-pretty-good-practice/
http://blog.leapoahead.com/2015/09/06/understanding-jwt/
http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/
传输数据签名和加密的作用
签名的作用: 防止数据被篡改.
如何保证不被篡改: 原始数据base64编码+随机字符串进行md5加密,如果被篡改,则服务端验证的时候签名和数据不对应.
加密的作用: 防止数据泄露
api接口访问流程
01
要点:
1.访问接口之前需要持有jwt令牌
2.访问接口的json数据需要进行base64编码,编码之后需要进行md5签名(编码+混淆字符串)
3.混淆字符串通过获取jwt token的接口同时获取
02
流程图:

1.客户端请求auth接口,获取jwt token,请求时一般携带用户名和密码,
或者手机号和验证码等.
2.服务端返回jwt token和用于签名用的混淆字符串(混淆字符串的作用是
对客户端传输数据进行签名)
3.客户端对传输数据(一般为json数据)进行base64编码(保证解析json的顺序)
将编码之后的数据和混淆字符串拼接 进行md5加密,加密结果作为签名
4.将md5加密之后的数据和base64编码的数据发送给hello接口
5.将客户端传来的数据进行签名校验,验证签名是否正确,是否超时等一系列操作
6.校验成功的话,正常返回hello接口内容,校验失败的话返回签名异常
后端Jwt及签名的实现
AuthController控制器为auth接口(作用:验证请求账号密码,返回jwt token和签名用的随机字符串)
WithSignMessageConverter类实现签名校验,并可以把base64编码的内容转化成实体
AuthFilter过滤器验证客户端的jwt token是否正确,是否超时等等
DataSecurityAction接口定义了数据传输的保护措施,目前默认的是只对数据进行base64编码,可以自行实现该接口实现自己业务需要的加密方式
JwtTokenUtil类为jwt token相关的工具类
IReqValidator接口为AuthController控制器中验证账号密码是否正确的操作
前端签名实现
DecryptTest类模拟了客户端得到jwt token和签名用的随机字符串之后的操作
总结:
1:使用springboot + apache shiro + mybatis框架,mybatis-plus ,restful风格api,json-web-token等最新技术,是项目配置简单,容易上手开发
2: 使用代码生成器,提过工作效率
3: 使用jwt来实现前后端段分离后无状态的用户认证及加密
作者:郭雷博,一位混迹多年的码农
编辑:徐菲

据说中国有句古语叫「金无足赤,人无完人」,但是,如果谁真的想打起灯笼来到市面上寻找完人,最终令他感到的可能不是一种失望,而是一种意外:完人可能就是那些终日为「善」而奔走,而又在不知不觉中实现了「美」的「真」实不虚的普通人。
追求完美是正常而有缺憾的人性。
--尼采






