最近在学习的内容
为什么叫这个名字,是因为我还没想好应该叫什么。从春节开始,到疫情原因在家办公,我一直都在试图去多学点东西,多一点提升,但就最近几周的收获而言,我决定一切的提升和进步都应该是目标导向的,而且是要有非常明确的目标,为什么这么说,因为这是我最近几周来的收获和感受。
问题
最近一两周,我一直在做一个新的需求(准确的说是两个,功能类似),基本功能就是后端生成一个pdf报表,然后签章,然后返回预览,并提供打印和下载功能(前期没有考虑预览和打印,第一版发布后客户新提出的)。
我的实际情况是,报表生成,签章都没有什么问题(前期工具类已经写好了,只是简单改造),存在的问题是:
- 前后端文件传输问题:文件服务器是内网环境,前端页面是外网环境
- pdf下载、预览(打印)
- 测试环境不好测试的问题(这个问题不能算问题,但是也是因为这一点,我才有了把整个项目重构的想法)
解决方案
针对以上问题,我的解决方案如下:
- 第一个问题,文件传输问题,我首先想到的是
base64
传输。后端生成base64
返回给前端,前端通过解码base64
生成文件,并下载(没有预览需求的时候就只是这么搞的),为了更友好,更优雅,我中间加了一个文件下载接口,也就是发送文件生成请求返回文件路径,然后在调用下载文件接口的时候在返回文件base64
编码 - 第二个问题,先考虑的是
pdfobject.js
,但后来发下它不兼容360浏览器(兼容模式),而且必须传文件名(没详细查资料,希望被科普),所以最后放弃了,继而选了psf.js
,查了很多资料和博客,最后所有功能都实现了(通过组合模态框和iframe
,最后的效果还不错) - 第三个问题起始是比较费时间的,也早于前两个问题,因为我对项目的原架构诟病已久,我觉得有点杀鸡用牛刀了。项目之前用的是
dubbo
+spring
+zookeeper
,甚至还用到了redis
集群,而且还涉及到单点登陆(sso
),而且这个项目最开始搭建的时候我也没参与,我写的是后端业务接口,不怎么熟悉,只知道如何打包,如何部署,如何修改,了解一些皮毛,虽然也参照原有消费者,写了一个新的消费者端,但由于单点登陆架构不清楚,我最后自己用shiro
自己重写了登陆部分。因为调用的全是别人的接口,虽然本地环境搭建起来了,但是也不好测试,启动这么多东西(单点登陆消费者/提供者、核心接口消费者/提供者、redis
集群、zookeeper
、后端接口),本地内存也扛不住,最主要启动超级慢,然后我最后痛下决心,决定重构所有服务,采用springboot
,简化开发流程,这里面最繁琐、最有挑战的就是单点登陆,也是花费时间最久的,前前后后花了很多时间去琢磨和研究,测试了很多方案,包括shiro
、cas
等,最后选了jwt
,当然也走了很多弯路,踩了很多坑,还好一切都很顺利,圆满达成目标。
好了问题说完了,第三个问题说的有点多,当然也是收获最多的,下来我要说的是,基于以上问题我的收获和解决方案,由于篇幅问题,这篇文章就不做过的说明,这里预告下关于以上问题,近期会写的一些内容,算是一种梳理、一次总结、一些收获:
sso
常见解决方案及基本原理jwt
基本知识及完整实现示例springboot
拦截器、过滤器配置springboot
请求参数替换解决方案(比如在请求参数中增加当前用户用户名)springboot
小知识拓展- 前后端
base64
pdf文件传输解决方案 - pdf文件预览实现:
base64
/文件路径
以上这个内容会在近期不定时发布,是我对自己近期工作和学习的总结,也算是自己的一些记录,如果哪位小伙伴有更好的解决方案和建议,欢迎留言