当前位置: 首页 > news >正文

静态文件鉴权

静态文件鉴权的解决方案

背景介绍

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,所以我这里抛出了异常。

访问成功效果:

访问失败效果:

相关文章:

静态文件鉴权

​ 静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统,是对BXX受理业务的强力补充系统,他允许操作员拿着IPAD,和客户约定地点上门受理业务。 因一些业务的受理,按照最新的业务规章制度,需…...

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有: 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…...

layui(2.8.18)生成验证码

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>登入</title><meta name"renderer" content"webkit"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&quo…...

MAX/MSP SDK学习05:A_GIMME方法

今天终于将A_GIMME方法部分的描述看懂了&#xff0c;上周因为太赶时间加上这文档很抽象一直没看懂。也就那么一回事&#xff0c;记录一下。 A_GIMME方法用于接收多个参数。 ①内置消息选择器传递多个参数时一定要使用A_GIMME&#xff1b; ②自定义消息选择器传递多个参数时建…...

LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」

原文&#xff1a;LangChain: 类似 Flask/FastAPI 之于 Django&#xff0c;LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 说明&#xff1a;LangServe代替 langchainserver 成为新的langchain 部署工具 官网资料&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &…...

mmdet全教程

官方给的文档一言难尽&#xff0c;网上的教程又没有从大纲到源码的完整解读&#xff0c;计划年后开个系列记录一下...

1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;分区域汇总&#xff1a…...

Guava的Retryer

Retryer类是Guava库中的一个重试工具类&#xff0c;它提供了一种在调用方法时自动重试的机制。Retryer类中的call()方法用于执行需要重试的方法&#xff0c;如果方法执行失败&#xff0c;则Retryer会根据配置的规则进行重试。Retryer类可以配置重试的次数、重试间隔时间、重试的…...

Docker实践笔记7:构建MySQL 8镜像

使用Docker构建MySQL 8镜像并运行容器 本教程将指导您使用Dockerfile构建和运行一个MySQL 8容器。让我们开始吧&#xff01; 步骤1&#xff1a;创建Dockerfile 在您的项目根目录下创建一个名为Dockerfile的文件。以下是Dockerfile的示例内容&#xff1a; # 基于最新的MySQL…...

# 学习 Prolog 和 离散逻辑的16个等价公式:一趟有趣的逻辑之旅

Prolog 的语法很奇怪,需要一些时间来适应,所以我花了点时间,想用Prolot来学习和验证离散逻辑的16组等价公式。 1. 双重否定律 (Double Negation Law) A ⇔A 首先&#xff0c;我们来看看双重否定律。在 Prolog 中&#xff0c;我们可以这样验证它&#xff1a; fun1(A,Z):-memb…...

Win11+Modelsim SE-64 10.6d搭建UVM环境

1、添加源文件及tb文件 在目录下建立文件夹&#xff0c;将DUT和Testbench添加进去&#xff0c;文件夹内容如下所示&#xff1a; 2、以《UVM实战》中的例子做简单的示例&#xff1a; 2.1 设计文件 &#xff1a;dut.sv 功能很简单&#xff0c;即将接受到的数据原封不动发送出去…...

LeetCode(32)串联所有单词的子串【滑动窗口】【困难】(含图解)

目录 1.题目2.答案3.提交结果截图4.图解 链接&#xff1a; 串联所有单词的子串 1.题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 w…...

【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案

目录 一、问题背景&#xff1a; 二、实际示例&#xff1a; 三、解决方案&#xff1a; 1. Delphi 代码&#xff1a; 2. javaScript代码&#xff1a; 一、问题背景&#xff1a; 在用Delphi开发程序&#xff0c;无论是移动端还是PC端&#xff0c;都可以很方便的使用TWebBrows…...

04 if进阶

elif 否则如果 如果条件没有满足 会继续进入“否则如果”里面判断 只要满足一个条件 条件判断立即终止 chinese 100 if chinese 100:print("我们去迪士尼玩")elif chinese > 90:print("我们去朱雀森林公园")else:print("回家写作业")if n…...

2023全球数字贸易创新大赛9-12

目录 回答评委提问:先说痛点-再说怎样解决 食品安全溯源是否全流程 星火• 链网...

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们&#xff0c;需要将引入的方法作为一个变量使用。以vue-store为例&#xff0c;如果我们按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…...

Ubuntu环境下基于libxl库文件使用C++实现对表格的操作

功能 表格不存在则创建后再进行操作创建sheet添加新的工作表在sheet中增加数据设置单元格样式 相关配置 下载地址&#xff1a;libxl选择 LibXL for Linux 4.2.0 i386 x64 armhf aarch64 安装配置 1&#xff0c;使用 tar zxvf 文件名.tar.gz 进行文件解压2&#xff0c;创…...

Sentinel与SpringBoot整合

好的&#xff0c;以下是一个简单的Spring Cloud整合Sentinel的代码示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…...

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 &#x1f389;如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&…...

(动手学习深度学习)第13章 计算机视觉---微调

文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…...

深度学习如何将MRI扫描时间缩短4倍?揭秘FastMRI的革命性突破

深度学习如何将MRI扫描时间缩短4倍&#xff1f;揭秘FastMRI的革命性突破 【免费下载链接】fastMRI A large-scale dataset of both raw MRI measurements and clinical MRI images. 项目地址: https://gitcode.com/gh_mirrors/fa/fastMRI 想象一下&#xff0c;你正躺在M…...

KSail:统一Kubernetes本地开发工具链的聚合器与标准化平台

1. 从工具沼泽到单一入口&#xff1a;为什么我们需要 KSail&#xff1f; 如果你和我一样&#xff0c;在 Kubernetes 这片“云原生”的汪洋里扑腾过几年&#xff0c;那你一定对下面这个场景不陌生&#xff1a;为了在本地拉起一个开发集群&#xff0c;你打开终端&#xff0c;开始…...

MCP 2026细粒度权限动态管控配置(含FIPS 140-3合规模板、OPA/WASM策略包及审计日志溯源Schema)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;MCP 2026细粒度权限动态管控配置 MCP 2026 是新一代云原生权限治理框架&#xff0c;其核心能力在于支持运行时策略注入与上下文感知的细粒度权限决策。与传统 RBAC 模型不同&#xff0c;它基于属性&…...

如何3分钟完成AI模型部署?Sakura启动器图形化界面终极指南

如何3分钟完成AI模型部署&#xff1f;Sakura启动器图形化界面终极指南 【免费下载链接】Sakura_Launcher_GUI Sakura模型启动器 项目地址: https://gitcode.com/gh_mirrors/sa/Sakura_Launcher_GUI 还在为复杂的命令行参数和繁琐的模型配置而头疼吗&#xff1f;&#x1…...

物理知识点

⚙️ 经典力学(基础核心) • 质点运动学 • 参考系与位置矢量、位移 • 速度、加速度的矢量定义与导数表示 • 直角/自然/极坐标下运动分解 • 切向、法向加速度的物理意义 • 匀变速/抛体/圆周运动公式 • 伽利略速度变换(相对运动) • 质点动力学 • 牛顿三大定…...

深入理解与实战应用:Python爬虫中的Robots.txt规范与urllib.robotparser完全指南

目录 第一章:robots.txt协议的来龙去脉 1.1 历史渊源:1994年的一个夏天 1.2 robots.txt的基本语法 1.3 robots.txt的局限性 第二章:urllib.robotparser模块完全解析 2.1 模块概览与设计哲学 2.2 基础用法示例 2.3 核心API详解 2.4 实战:构建robots.txt检查器 第三…...

Ubuntu 20.04下搞定CH341串口驱动:从下载到开机自启的保姆级避坑指南

Ubuntu 20.04下CH341串口驱动全攻略&#xff1a;从安装到故障排除的终极指南 当你第一次在Ubuntu系统上连接CH341串口设备时&#xff0c;可能会遇到各种令人头疼的问题。无论是Arduino开发板、ESP32模块还是3D打印机控制器&#xff0c;稳定的串口连接都是开发调试的基础。本文将…...

对比不同时段调用 Taotoken 同一模型的延迟体感差异

不同时段调用 Taotoken 同一模型的延迟体感观察 1. 测试环境与模型选择 本次观察基于开发者日常使用场景&#xff0c;调用 Taotoken 平台上的 Claude-Sonnet-4-6 模型进行测试。测试周期持续一周&#xff0c;覆盖工作日与周末的不同时间段。测试环境采用稳定的企业级网络连接…...

Qt程序在银河麒麟上字体报错?别慌,手把手教你两种字体部署方案(附DejaVu字体下载)

Qt程序在银河麒麟系统上的字体问题解决方案 第一次在银河麒麟上运行Qt程序时&#xff0c;看到满屏的"QFontDatabase: Cannot find font directory"错误提示&#xff0c;确实让人有点懵。这种问题在国产化操作系统迁移过程中很常见&#xff0c;尤其是从Windows开发环境…...

开源机械爪项目实战:从结构设计到控制算法的完整开发指南

1. 项目概述&#xff1a;一个开源“机械爪”的宝藏仓库如果你对机器人、自动化或者开源硬件感兴趣&#xff0c;最近在GitHub上闲逛时&#xff0c;大概率会刷到一个名为“awesome-openclaw”的仓库。这个项目由用户ZeroLu创建&#xff0c;标题直译过来就是“很棒的开源机械爪”。…...