fastdfs实现防盗链功能

简介: fastdfs实现防盗链功能



一、实现原理

fastdfs是一个分布式文件系统,如果我们的fastdfs部署在外网,那么任何一个人知道了我们的上传接口,那么它就可以文件的上传和访问。那么我们如何阻止他人访问我们fastdfs服务器上的文件呢?因此就需要使用fastdfs的防盗链功能。

原理:fastdfs的防盗链是通过token机制来实现的。当我们开启防盗链功能后,需要在url后增加2个额外的参数tokentstokents的生成都是需要在服务端。

二、开启防盗链

vi /etc/fdfs/http.conf

# true 表示开启防盗链
http.anti_steal.check_token = true
# token的过期时间,单位为秒
http.anti_steal.token_ttl = 300
# 密钥,不可泄漏,用于生成token
http.anti_steal.secret_key = thisisasecuritykey
# 当图片拒绝访问后,显示的图片,此图片需要可访问,不然可能会出现问题
http.anti_steal.token_check_fail = /data/fastdfs/404.jpg

http.anti_steal.token_check_fail 指定的图片需要可访问,否则可能会出现问题

三、重启nginx

/usr/local/nginx/sbin/nginx -s reload

四、 Java代码生成token

1、token生成规则

token = md5(文件ID+私钥+时间戳) 文件ID:不能包含group

group1/M00/00/00/wKh5iWNBl7-AKvj1AAAwWD4VeAg577.jpg
`需要替换成`
M00/00/00/wKh5iWNBl7-AKvj1AAAwWD4VeAg577.jpg

私钥:需要和 /etc/fdfs/http.conf 中的 http.anti_steal.secret_key 值一致

时间戳:单位秒

2、java生成token
/**
     * 生成token
     *
     * @param fileId          the filename return by FastDFS server,不能含有组
     * @param timestampSecond 时间戳 单位秒
     * @return token
     * @throws NoSuchAlgorithmException
     */
    private String generatorToken(String fileId, Long timestampSecond) throws NoSuchAlgorithmException {
        // 需要去掉 group
        fileId = fileId.substring(fileId.indexOf("/") + 1);
        byte[] bsFilename = fileId.getBytes(StandardCharsets.UTF_8);
        byte[] bsTimestamp = timestampSecond.toString().getBytes(StandardCharsets.UTF_8);
        // thisisasecuritykey 需要和 /etc/fdfs/http.conf 中的 http.anti_steal.secret_key 值一致
        byte[] bsKey = "thisisasecuritykey".getBytes(StandardCharsets.UTF_8);
        byte[] buff = new byte[bsFilename.length + bsKey.length + bsTimestamp.length];
        System.arraycopy(bsFilename, 0, buff, 0, bsFilename.length);
        System.arraycopy(bsKey, 0, buff, bsFilename.length, bsKey.length);
        System.arraycopy(bsTimestamp, 0, buff, bsFilename.length + bsKey.length, bsTimestamp.length);
        return md5(buff);
    }
    public static String md5(byte[] source) throws NoSuchAlgorithmException {
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        md.update(source);
        byte tmp[] = md.digest();
        char str[] = new char[32];
        int k = 0;
        for (int i = 0; i < 16; i++) {
            str[k++] = hexDigits[tmp[i] >>> 4 & 0xf];
            str[k++] = hexDigits[tmp[i] & 0xf];
        }
        return new String(str);
    }

五、测试

1 带正确token访问

2 带错误token访问,或直接访问

这个地方返回的图片是 http.anti_steal.token_check_fail = /data/fastdfs/404.jpg 这个配置中配置的图片

大功告成!!噢耶!

参考:FastDFS FAQ (欢迎反馈,我将及时整理) - 分布式文件系统(FastDFS)-Chinaunix

目录
相关文章
|
存储 JSON API
SpringBoot3集成ElasticSearch
SpringBoot3集成ElasticSearchElasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,适用于各种数据类型,数字、文本、地理位置、结构化数据、非结构化数据;
1910 0
|
缓存 JSON 前端开发
CORS 详解,终于不用担心跨域问题了
CORS 详解,终于不用担心跨域问题了
9230 1
CORS 详解,终于不用担心跨域问题了
|
1月前
|
人工智能 安全 JavaScript
CoPaw是什么?和OpenClaw有什么差异?部署OpenClaw配置阿里云百炼API及避坑指南
CoPaw(Co Personal Agent Workstation)是阿里云通义实验室基于AgentScope框架于2026年2月开源的个人AI助手,定位为**面向普通用户的国产友好型AI智能体**,主打“本地/云端双部署、国内平台原生适配、主动执行任务、零代码扩展”。其核心是做能主动协作、全域可用的“搭档小爪子”,目标用户覆盖职场人、内容创作者与中小企业,强调开箱即用与本土化体验。
4630 4
|
Java 文件存储 Spring
轻松实现Spring Boot与FastDFS的无缝整合
家人们啦!,上篇文章了,我们讲了如何使用docker-compose快速部署fastdfs,在今天的文章中,我将向大家介绍如何将Spring Boot与FastDFS进行无缝整合,以便高效地管理和操作文件存储。通过这个整合,你将能够轻松地在Spring Boot应用程序中实现文件的上传和下载等功能。让我们开始吧
915 0
轻松实现Spring Boot与FastDFS的无缝整合
|
9月前
|
安全 Linux 网络安全
Linux系统怎么设置允许root登录
在 Linux 系统中,允许 root 用户 通过 SSH 登录是通过修改 SSH 配置文件 /etc/ssh/sshd_config 中的 PermitRootLogin 参数来实现的。默认情况下,出于安全考虑,很多 Linux 发行版会禁用 root 用户的 SSH 登录。因此,你可以按照以下步骤来允许 root 用户通过 SSH 登录:
2470 0
|
IDE Java 测试技术
IDEA安装并使用通义灵码
本文介绍了“通义灵码”这一智能编码助手的功能特点,并提供了在IDEA中安装和使用的详细步骤,旨在帮助提升编程效率和代码质量。
IDEA安装并使用通义灵码
|
10月前
|
运维 Ubuntu Linux
Linux重置root用户密码
本文详细介绍了Linux系统中root密码重置的核心技能,涵盖主流发行版如RHEL、CentOS、Debian、Ubuntu、Arch、openSUSE等的实操方法。内容包括通过GRUB引导编辑、单用户模式和Live CD救援三种方式重置密码的具体步骤,适配物理机、虚拟机及云服务器环境。文章分步解析了启动拦截、权限获取和密码重置三大阶段,并提供各发行版的实际操作代码示例,帮助管理员快速解决忘记root密码的问题。
|
NoSQL Java Redis
springboot怎么使用Redisson
通过以上步骤,已经详细介绍了如何在Spring Boot项目中使用Redisson,包括添加依赖、配置Redisson、创建配置类以及使用Redisson实现分布式锁和分布式集合。Redisson提供了丰富的分布式数据结构和工具,可以帮助开发者更高效地实现分布式系统。通过合理使用这些工具,可以显著提高系统的性能和可靠性。
4024 34
|
Java Spring
SpringBoot: 启动Banner在线生成工具
SpringBoot: 启动Banner在线生成工具
39562 1
SpringBoot: 启动Banner在线生成工具

热门文章

最新文章