暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

后台框架开发指南及技术分享

万物可述 2021-06-29
633


这是万物可述的第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来实现前后端段分离后无状态的用户认证及加密




作者:郭雷博,一位混迹多年的码农

编辑:徐菲





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

追求完美是正常而有缺憾的人性。

--尼采


文章转载自万物可述,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论