静态文件鉴权

news2024/9/22 11:32:32

静态文件鉴权的解决方案

背景介绍

XX业务系统作为BXX业务系统的孪生姐妹系统,是对BXX受理业务的强力补充系统,他允许操作员拿着IPAD,和客户约定地点上门受理业务。

因一些业务的受理,按照最新的业务规章制度,需要客户观看XX视频方可受理,我们现阶段,视频文件的URL是直接暴露在公网上,通过URL是可以直接浏览相关的视频文件,由此引申出了静态文件鉴权的需求。

客户需求

接到XX客户的需求,他们要求暴露在互联网公网的视频的URL,不能在浏览器中直接输入地址访问,因为视频内容属于较敏感的内容,需要保护,要求增加操作员登录认证机制。

解决方案

一、response输出流

拿到需求,我首先想到的就是通过response.getOutputStream().write输出文件流的方式来解决此问题,但是立马被组内前端人员否决掉,此方案会影响前端体验。在体验为王的时代,此方案确实不妥,后端Java接口,首先需要从文件服务器获取相应的文件,然后再通过response写流的方式输出,此方案会有一个文件服务器获取步骤,对比公网直接访问,相关于多了一次文件流的流转动作,这样就会造成前端的卡顿感,并且文件预览的功能,估计也拜拜了。此方案——NO PASS!

二、静态文件鉴权

在我的认知中,我绝对不会是第一个有这需求的人,世界这么大,我要去问问。于是,“静态文件鉴权”六个字在我脑海中浮现,我毫不犹豫在百度的搜索框中输入这六个大字,相关解决方案的文章尽在眼底,通过相关知识的消化、吸收、本地Demo的模拟、开发环境的测试,最终验证了静态文件鉴权的可行性。最终的结果,虽然看似简单,几行代码,几行配置就解决了相关问题,但是其中还是走了不少弯路,好在消化吸收总结了。

三、OpenResty解决方案

OpenResty是一个基于Nginx与Lua的高性能Web平台,相当于二次封装了nginx,并且集成了lua脚本,开发人员只需要简单的编写lua的脚本,就可以实现静态文件鉴权的相关的逻辑了。

百度下载

  1. openresty-1.21.4.3-win64.zip——主程序
  2. lua-resty-http-master.zip——让lua脚本支持http发包

解压openresty本地目录,发现此软件真的就是在nginx上包了一层,替换ngnix成本极小。 启动命令,配置文件,都与ngnix一模一样。

解压lua-resty-http,将\lib\resty\目录下http*.lua的三个文件copy至openresty\lualib\resty\目录下,即可让lua脚本支持http发包。

修改配置nginx.conf,在server中增加相应的location,我这里映射了所有mp4结尾的请求

Lua脚本:

可以看到脚本非常简单,Lua中..是连接字符串的意思。

Controller:

我这里仅仅是为了验证可行性,所以就写死了判断,这里的返回值内容,会在Lua脚本中用到。

访问成功效果:

可以看到url中,带了?token=123456,视频正常播放。

访问失败效果:

我输入错误的token,或者不输入token,静态文件的访问被拦截了。

通过上面的模拟,此方案已经可以满足客户的需求了。

四、ngnix解决方案

当我将OpenResty解决方案向领导汇报时,立马被泼了一盆冷水,理由很简单,客户不会轻易同意替换ngnix,不可控的风险太大,日后出现问题的维护成本太高。虽然我据理力争,终究是未站在客户的角度考虑问题,所以我也只能接受领导的建议,寻找ngnix的解决方案。

Ngnix也能支持Lua脚本,但是需要重新编译才能支持Lua脚本。默认情况下,Nginx并不直接支持Lua脚本。要使其支持Lua脚本,需要进行一些额外的配置和编译步骤。对我来说,研究重新编译Ngnix的成本与风险,还真不如直接使用OpenResty,所以Ngnix支持Lua脚本的方案也被我自己否决了。

最后,绞尽脑汁,在百度,ChatGpt的帮助下,ngnix经过无数次的改配置,启动与重启中,终于在不依赖Lua脚本的前提下,也有了对应的解决方案。

修改ngnix.conf配置文件 :

token传参这里,卡了好久,经过反复试验,终于往header中增加url路径的方式测试成功,后端成功取到参数。

X-Original-URI是一个非标准的HTTP报文头,其作用是使用该报文头的值中所指定的URL覆盖请求目标中的URL。该报文头通常在代理服务器或负载均衡器中使用,用于记录原始请求的URL,以便在后续的处理中能够获取到原始的请求信息。然而,由于该报文头并非标准的HTTP报文头,因此不是所有的代理服务器或负载均衡器都支持该报文头。好在ngnix支持了该报文头。

Java后端改造:

注意取到的X-Original-URI的内容,取到的内容,需要拆分字符串,提取token,我这里简单验证可行性,就没这些逻辑,简单判断下是否相等即可。Ngnix验证token失败,HTTP的响应码需要不为200,所以我这里抛出了异常。

访问成功效果:

访问失败效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React中封装echarts图表组件以及自适应窗口变化

文章目录 前言环境代码接口使用效果后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react.js 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,…

二手车选购参考:Honda CB650R/CBR650R 2019~2023 国产价格享进口本田

本田好,本田妙,本田大法呱呱叫。本田的650系列在国内可以说是伤透了一批老车主的心,上路12万,3年现在还值个4万,搁谁也受不了,正好没什么太好的新闻写,今天就带大家来看看二手车选购参考&#x…

常见树种(贵州省):004杨树种类

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、响叶杨…

Linux内核调试篇——获取内核函数地址的四种方法(一文解决)

在内核调试中,经常需要知道某个函数的地址,或者根据函数地址找到对应的函数,从而进行更深一步的debug。 下面介绍四种获取内核函数地址的方法: 1、System.map 在编译Linux内核时,会产生一个内核映像文件System.map&…

全志R128内存泄漏调试案例

内存泄露调试案例 问题背景 硬件:R128 软件:FreeRTOS rtplayer_test(Cedarx) AudioSystem 问题复现 复现步骤: rtplayer_test /data/boot.mp3串口输入"l", 循环播放串口输入"b" , 播放器后台执行 具体表现 rtpla…

软信天成:干货分享,如何实施云迁移策略!

当下,数据管理正在经历着一场时代的巨变。过去,本地数据库和数据仓库作为企业数据管理的重要手段一直为实现传统业务智能奠定基础。如今,随着云计算应用的迅速激增,越来越多的组织为把握机遇实现更高的业务敏捷度,准备…

项目交互-选择器交互

选择器交互 <div><el-select v-model"valueOne" placeholder"年级"><el-option v-for"item in optionsOne" :key"item.gradeId" :label"item.gradeName" :value"item.gradeId"></el-option&…

高并发分布式架构的演进之路

目录 单体架构 应用数据分离架构 应用数据集群架构 读写分离 / 主从分离架构 引⼊缓存⸺冷热分离架构 垂直分库 业务拆分-微服务 单体架构 一个系统初期&#xff0c;我们需要利⽤我们精⼲的技术团队&#xff0c;快速将业务系统投⼊市场进⾏检验&#xff0c;并且可以迅速…

安卓主板_MTK安卓一体机方案定制

安卓一体机主板集成多媒体解码、3G&#xff08;4G/5G可选&#xff09;模块&#xff0c;GPS&#xff0c;液晶驱动、WIFI、蓝牙、串口于一体&#xff0c;支持绝大部分当前流行的视频及图片格式解码。支持MIPI接口的1280*720分辨率的显示屏&#xff0c;最大支持1280*720P解码。大大…

非上市公司的财务报表可以找到吗?

企业财务报表 财务报表是反映企业或预算单位一定时期资金、利润状况的会计报表。我国财务报表的种类、格式、编报要求&#xff0c;均由统一的会计制度作出规定&#xff0c;要求企业定期编报。国营工业企业在报告期末应分别编报资金平衡表、专用基金及专用拨款表&#xff0c;基…

java中的抽象

1.当一个类中给出的信息不够全面时&#xff0c;&#xff08;比方说有无法确定的行为&#xff09;&#xff0c;它给出的信息不足以描绘出一个具体的对象&#xff0c;这时我们往往不会实例化该类&#xff0c;这种类就是抽象类。 2. 在Java中&#xff0c;我们通过在类前添加关键字…

怎样的一款嵌入式 IDE 才是各阶段嵌入式开发者所喜欢的?

怎样的一款嵌入式 IDE 才是各阶段嵌入式开发者所喜欢的? 1 一定要快&#xff0c;现在流行的VSCODE用起来是很爽&#xff0c;但是VSCODE的插件什么的&#xff0c;也很容易拖卡&#xff0c;更不要说source insight了&#xff0c;SI有一个致命的特点就是&#xff0c;某个时候会闪…

Vatee万腾携手Wiki EXPO 2023悉尼峰会 共谱辉煌未来

悉尼&#xff0c;这座充满活力和创新的城市&#xff0c;即将成为全球商业的焦点。2023年11月16日&#xff0c;由WikiEXPO主办的Wiki Finance Expo Sydney 2023在悉尼马丁广场1号富丽敦酒店隆重开幕&#xff0c;这场金融博览会是澳大利亚今年规模最宏大、备受期待的金融科技盛会…

leetcode刷题日记:202. Happy Number( 快乐数)和203. Remove Linked List Elements(移除链表元素)

202. Happy Number( 快乐数) 这一题的解决与之前的循环链表比较类似&#xff0c;因为如果不是快乐数的话&#xff0c;在数字变化的过程中必然遇到了数字变换的循环&#xff0c;所以我们需要在变换的过程中判断是否遇到了循环&#xff0c;判断是否在一个序列中存在循环&#xf…

使用frp搭建内网穿透服务

使用frp搭建内网穿透服务 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 1.下载frp 下载地址 2.服务端安装 …

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …

超长圆钢在线直线度检测 告别手工测量时代

圆钢的直线度指的是它的表面形状是否呈现出直线。直线度是圆钢的重要品质要求之一&#xff0c;与其物理性能密切相关。在工业制造中&#xff0c;如果圆钢的直线度不达标&#xff0c;就会影响其后续的加工和使用效果&#xff0c;严重时甚至会造成损失。 超长圆钢的检测&#xff…

【Python】12 GPflow安装

概述 GPflow 是一个基于TensorFlow 在 Python 中构建高斯过程模型的包。高斯过程是一种监督学习模型。 高斯过程的一些优点是&#xff1a; 不确定性是高斯过程的固有部分。高斯过程可以在不知道答案时告诉您。适用于小型数据集。如果您的数据有限&#xff0c;高斯过程可以从…

电磁场与电磁波part6、7--均匀平面波的反射与透射、导行电磁波

1、分界面上的反射系数 反射波电场振幅 与入射波电场振幅 的比值&#xff0c;即&#xff1a; 2、驻波系数&#xff08;驻波比&#xff09; 合成波的电场强度的最大值与最小值之比&#xff0c;即&#xff1a; 3、导波系统中电磁波的传输问题属于电磁场边值问题&#xff0c;即…

【云栖 2023】张治国:MaxCompute 架构升级及开放性解读

云布道师 本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下 演讲人&#xff1a;张治国|阿里云智能计算平台研究员、阿里云 MaxCompute 负责人 演讲主题&#xff1a;MaxCompute架构升级及开放性解读 活动&#xff1a;2023云栖大会 MaxCompute 发展经历了三个阶…