GNO中文网
你的位置:v.systems中文网 > GNO中文网 >
基于java实现具有时效性文件链接
发布日期:2025-01-03 18:58 点击次数:185
1.写在前面
之前在某个项目中,用户上传的文件(头像、视频、文档等等)是通过静态路径来访问的,这导致一旦该文件的路径暴露,用户可以在不登录的情况下,直接访问服务器的文件资源。客户因此提出,文件的路径必须要具有时效性(类似对象存储的文件链接,超过一定时间就无法访问)。
我希望最终可以像对象存储一样,文件链接可以设定访问时间,超期后直接报错。比较常见的方法可以通过缓存来实现。思路如下:
1.后端在接收到文件的访问请求时,生成一个唯一的文件ID,将它和指定的前缀拼接为URL返还给前端,并同时将此ID作为key,文件信息作为value存入缓存信息。
2.前端通过返回的文件链接访问后端,后端对链接中的ID进行截取,前往缓存中查询,如果存在则以流的的形式返回文件,否则直接返回错误信息。
时序图如下:
2.时序图
3.关键技术点
3.1时效性
对于时效性,我们可以通过缓存来实现。通过给缓存添加时间限制,到期就移除,从而达到URL的时效性。这里我们通过简单的缓存工具类来实现(也可用redis,数据库理论上也可以,通过存文件的存入时间,每次文件请求的时候判断一下是否超期,思路上是可以的,但是考虑访问速度并不推荐)。
以下是缓存对象:
再写个简单的工具类来操作:
3.2同一个接口返回文件资源和错误信息
首先我们要知道,浏览器在访问某个链接的时候,会根据服务器返回的Response的中的Content-type来决定如何执行响应。如果服务器未指定任何Content-type,浏览器有内置的处理能力来对常见的链接(图片、PDF)进行处理,常见的比如说使用浏览器去打开图片,打开控制台,浏览器会有一个默认的网页将文件链接放在里面。
因此,我们可以通过同一个Mapping,实现不同的Response的返回,从而达到既能返回文件,又可以返回错误信息。需要的Response格式如下:
1.流式文件下载
2.json格式错误返回
这里可以使用策略模式进行改写,首先我们构建一个简单的处理响应的接口:
A.下载文件策略处理类
B.无文件策略类
4.流程及源码分析
4.1文件上传接口
文件上传我们可以分为三步:文件接收并存储、数据库记录插入和存入缓存。具体代码如下:
这里我们通过fileService同时进行文件的存储和数据库插入,然后通过缓存工具类cacheManagerUtil存储,使用Apifox进行接口测试,结果如下:
其中返回的文件链接为:<:8080/timelyFileLink/file/22bb8cda-99d8-4b0b-a6aa-9e3d516b5a5f>URL中的22bb8cda-99d8-4b0b-a6aa-9e3d516b5a5f就是我们缓存到服务器上的key
4.2链接校验
这里我们分为两步:缓存校验和返回不同的Response。代码如下:
我们先使用缓存工具类进行校验,如果文件是超期或者不存在的,浏览器会直接返回错误的json信息:
如果文件是存在,浏览器输入这个链接会直接下载:
如果html中有地方调用了这个图片,那么图片会自动反显,这里我们写一个简单的html测试代码:
页面如下:
可以看到对于流式的接口,浏览器会自动反显图片。
5.总结
整个Demo都是基于缓存操作来实现链接的时效性,对于需要展示文件链接的页面,可以通过这种时效性链接来实现访问文件的安全性。但由于是操作缓存,实际我们在使用的时候需要考虑用户数量、接口频率、缓存大小等等问题,如果是正式项目,我其实更建议使用redis,方便进行缓存的管理以及问题的排查。
以上就是基于java实现具有时效性文件链接的详细内容,更多关于java时效性文件链接的资料请关注脚本之家其它相关文章!
上一篇:没有了
下一篇:跑跑宝宝辅助