Nginx实现静态文件鉴权代理+Java示例
Nginx配置文件
127.0.0.1_8965.conf
server {
listen 8965;
server_name 127.0.0.1;
# 文件请求
location /file/ {
root D:/home/pmps/;
#autoindex on;
# 设置鉴权的请求
auth_request /authFileValid;
# 从URL查询参数中获取 token,并赋值给token变量
set $token $arg_Token;
# 从请求头Token,并赋值给token变量
#set $token $http_Token;
# 直接返回错误信息
error_page 401 = /auth-required;
}
location = /authFileValid {
internal; # 只允许内部访问
proxy_pass http://127.0.0.1:8960/system/file/auth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
# 设置Token 的值为变量token
proxy_set_header Token "$token";
}
location = /auth-required {
return 401; # 返回 401 状态码
}
# 其他接口请求
location / {
client_max_body_size 100m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8960/;
}
}
Java鉴权代码示例
我这里用的是SaToken,token请求头名是:Token
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.context.SaHolder;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.regex.Pattern;
/**
* 系统文件相关
*/
@Tag(name = "系统文件管理", description = "系统文件相关接口")
@RestController
@RequestMapping("/system/file")
public class SysFileController extends BaseController {
@RequestMapping("/auth")
@ResponseBody
@SaIgnore
public void authFileValid(HttpServletRequest request, HttpServletResponse response) {
String token = request.getHeader("Token");
if (ObjectUtil.isEmpty(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return;
}
LoginUserBo loginUserByToken = LoginHelper.getLoginUserByToken(token);
if (ObjectUtil.isNull(loginUserByToken)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return;
}
String originalURI = request.getHeader("X-Original-URI");
boolean b = validateURIWithWhitelist(originalURI);
if (!b) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
} else {
response.setStatus(HttpStatus.OK.value());
}
}
//这里越权检查,你可以自行更换其他更好的写法
public boolean validateURIWithWhitelist(String originalURI) {
if (originalURI == null) {
return false;
}
try {
URI uri = new URI(originalURI);
String path = uri.getPath();
if (path == null) {
return false;
}
// 定义允许的路径模式 - 不限制文件后缀
// 格式: /file/2025/10/96da59e0edc2a7fa2ab7959b286235e.xxx
Pattern allowedPattern = Pattern.compile("^/file/\\d{4}/\\d{2}/[a-zA-Z0-9][a-zA-Z0-9.-]*\\.[a-zA-Z0-9]+$");
// 验证路径格式
if (!allowedPattern.matcher(path).matches()) {
return false;
}
return !path.contains("..") && path.split("/").length >= 5;
} catch (Exception e) {
return false;
}
}
}
访问示例
- 文件请求:http://127.0.0.1:8965/file/2025/10/96da59e0edc2a7fa2ab7959b286235e.png?Token=你的Token
- 其他接口请求:http://127.0.0.1:8965/system/user/sysUserList
Nginx实现静态文件鉴权代理+Java示例的更多相关文章
- nginx增加自定义账号鉴权
nginx增加自定义账号鉴权 使用nginx反向代理实现 当一个站点内部程序是个黑盒(无法修改里面的请求逻辑),如何增加自己的账号系统鉴权 实现逻辑 使用nginx的反向代理功能 自定义账号系统增加两 ...
- Nginx 优化静态文件访问
简介 Web 开发中需要的静态文件有:CSS.JS.字体.图片,可以通过web框架进行访问,但是效率不是最优的. Nginx 对于处理静态文件的效率要远高于 Web 框架,因为可以使用 gzip 压缩 ...
- Django 关闭Debug后使用Nginx做静态文件的访问
Django 关闭Debug后使用Nginx做静态文件的访问 关闭Django 的Debug参数 1 . 修改settings.py配置文件 DEBUG = False 2 . settings.py ...
- nginx访问静态文件配置
通过nginx访问静态文件配置,均是在server模块中配置,有两种方式: 1.alias 通过alias关键字,重定义路径,如 server{ listen 7001; server ...
- Nginx配置静态文件服务从入门到精通
作者:三十三重天 博客:http://www.zhouhuibo.club 通过学习和分享的过程,将自己工作中的问题和技术总结输出,希望菜鸟和老鸟都能通过自己的文章收获新的知识,并付诸实施. 引言 使 ...
- 用nginx缓存静态文件
这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件) ...
- 用Nginx做静态文件的CDN
这是上个月一次搭建多个静态文件节点的实践,转载自我的博客,欢迎交流. 鉴于监管环境和网站速度之间的矛盾,目前的网络架构方式如下:1.web动态页面(含数据库)架设在位于美国西海岸的数据中心:2.静态文 ...
- nginx location静态文件配置
进入nginx安装目录的conf目录下,修改nginx.conf文件,在一个server{}中添加 一个location 部分配置代码如下 root@ubuntu:/usr/local/nginx/c ...
- docker应用栈实践-nginx处理静态文件
在我的djangoweb应用在docker搭建好之后,发现一些css静态文件返回没有content-type属性,导致浏览器log一堆警告,强迫症的我受不了这一情况 目前的应用栈结构图: 一共四个容器 ...
- windows下nginx直接处理静态文件
网上的沙雕们,你们发文章的时候就不能简单说明一下环境吗?老子都要看到一半才发现不是需要的类型 ji静态文件使用nginx直接处理,减轻tomcat压力 对于我的网站,静态文件有js css图片,然后图 ...
随机推荐
- iga 入门之 确定单元基函数
简介 摘自 流体力学数值方法 有限元方法基函数的基本特点 基函数的数目与全区域的结点数目相等,每个结点都对应一个基函数. 基函数的形状是"尖顶形"的,它所对应结点上的函数值为1,其 ...
- iPaaS集成平台与ESB在应用场景上的区别
在当今企业数字化转型的浪潮中,集成平台的重要性日益凸显.谷云科技作为企业集成平台技术厂商,在与客户的交流过程中,一个频繁被提及的问题是:ESB与iPaaS到底有何区别? 今天就让我们深入探讨一下这两者 ...
- void swap(double& val1,double& val2); 这是什么意思
void swap(double& val1,double& val2);这是什么意思? 定义了一个叫做 swap 的函数,它接受两个双精度数的引用作为参数 在 C++ 中,& ...
- Unity编辑器调用外部exe程序 和 windows文件夹
直接来,1个脚本 using System.Collections; using System.Collections.Generic; using System.Diagnostics; using ...
- Atcoder Beginner Contest 299 G
对于要打印的 \(B\),我们首先尝试确定 \(B_1\). 让 \(f(x) (1≤x≤M)\) 是最大的 \(i\),使 \(A_i = x\). 对于 \(r:=\underset{{{1≤x≤ ...
- 我让AI写了篇《让子弹飞》的影评,看完我沉默了
<让子弹飞>是部好电影,但也是最难写影评的电影之一. 珠玉在前,分析它的文章汗牛充栋,想写出点新意,太难了.前几天恰好要写一篇,对着文档,半天憋不出一个字. 后面我抱着试试看的心态,用了一 ...
- Js克隆对象
Js克隆对象 1 浅复制 具体方法 // 数组 Array.prototype.slice const oldArr = new Array(100).fill(null).map(() => ...
- Python文件处理之购物车系统
一.Python文件处理之购物车系统 用户名和密码存放于文件中,格式为:nick,nick123 加载所有用户名,检查用户名是否已存在 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表, ...
- linux三剑客详解
grep命令 ⽀持的正则参数 支持的正则 描述 -E,–extended-regexp 模式是扩展正则表达式(ERE) -P,–perl-regexp 模式是perl正则表达式 -e,–regexp= ...
- Java面向对象——6.抽象类
目录 抽象类 抽象类的概念 为什么需要抽象类? 抽象类的定义格式 抽象类的特性 抽象类与普通类的区别 总结 抽象类 在Java面向对象编程中,抽象类(Abstract Class)是一种特殊的类,它不 ...