前端加载私有文件随想
在前后端分离的工程中,前后端通信链路由前端调用后端,变成了前端–>api gateway–>后端,那么前端在加载一些私有资源(需要权限,需要认证)等文件时会存在无法传入token的问题 本文是针对前端加载资源的随想
未前后端分离调用链路
前端 ------> 后端 ------> 返回结果到前端
前后端分离调用链路
前端 ------> API gateway ------> 后端 ------> 前端
解决方案列表
在前端加载一些文件,例如图片,浏览器会根据image标签的src属性自动获取图片的二进制流,浏览器在加载图片时,不会带上token在header中,一切都是浏览器默认行为,所以此处无法利用浏览器默认行为加载私有文件,所以提出了以下几种解决方案.
- 前端ajax加载,后端返回base64,前端再做处理
- 前端在url中加入token,传入到后端
- 前端获取token,存入cookie,后端根据优先级来获取token
下面我们分别来说说这三种方案.
前端ajax加载,后端返回base64,前端再做处理
链路图如下:
前端ajax ------> API gateway ------> 后端base64 ------> 前端设置图片base64
前端:使用ajax加载图片,ajax中带上token等认证信息 后端:在接收到请求后,将图片转为base64字符串,通过response返回至前端 前端:在接收到后端返回后,将base64设置至相关的image中
- 优点:
- 遵循原有token机制
可解决加载机制
缺点:
base64在后端转换增加了后端压力
base64在前端处理较为麻烦(如果有大量图片,容易产生阻塞)
整个链路复杂度太高了,涉及到很多流的操作
其他类型的文件无法满足此需求
前端在url中加入token,传入到后端
链路图如下:
前端修改图片url ------> API gateway ------> 后端返回图片二进制
前端:在加载图片时,先修改图片的url,带上token参数 后端:在接收到请求后返回图片二进制
- 优点:
- 前端没有上一个方案那么复杂
- 后端也简单了很多
可以加载其他类型文件
缺点:
在大量图片的情况下,整体表现还是不好,因为每次要修改图片url
那么有没有一个前端做的事情少,后端也不那么复杂的方案呢?
前端获取token,存入cookie,后端根据优先级来获取token (推荐)
在前面两种方案中,都涉及到一个共同的地方,那就是需要多认证鉴权做一定的兼容处理 > 方案1:虽然可以满足token机制,但弊端太大 > 方案2:token的获取需要修改 结合两种方案,既然token机制不能满足,那么一个新的想法油然而生,链路如下:
链路1:
登录 ------> API gateway ------> 返回token ------> 存入cookie
链路1:前端在登录后,将认证服务返回的token 存入cookie中,作为一个兼容的方案来使用
链路2:
前端加载图片 ------> API gateway ------> 后端返回图片二进制
链路2:前端按照浏览器默认行为加载图片,此时浏览器默认会带上cookie,但是不会带上token,API gateway在收到请求后,根据优先级,先后读取header中的token,cookie中的token,如果是加载其他类型的文件并且header中的token为空,那么则使用cookie中的token进行认证鉴权,认证通过后转发到相应的后端服务进行资源加载,返回至前端
- 优点:
- 前端除了链路1的处理,其余全为默认行为
- 资源服务器不做修改
- API gateway增加了认证兼容性
前端没有对资源加载的修改,存入cookie的方式也有利于前端的整体控制
缺点:
需要修改认证
前端附加了一个cookie存储的需求(针对app)
以上几种方案各有利弊,在使用时择情采用,毕竟代码是死的,思想是活的.