fastdfs实现防盗链功能

目录

一、实现原理

二、开启防盗链

三、重启nginx

四、 Java代码生成token

1、token生成规则

2、java生成token

五、测试

1 带正确token访问

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


一、实现原理

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

FastDFS是一个开源的分布式文件系统,它由跟踪服务器(Tracker Server)和存储服务器(Storage Server)组成。它的底层实现原理主要包括文件上传、文件下载和文件删除三个过程。 1. 文件上传: - 客户端将文件分割成固定大小的块,并将这些块分别上传到不同的存储服务器上。 - 跟踪服务器记录文件的元数据信息,包括文件名、文件大小、存储服务器地址等。 - 存储服务器将文件块保存在本地,并返回文件块的索引信息给跟踪服务器。 2. 文件下载: - 客户端向跟踪服务器发送文件下载请求,跟踪服务器根据文件名查找对应的存储服务器地址。 - 客户端根据存储服务器地址连接到对应的存储服务器,并发送文件块的索引信息。 - 存储服务器根据索引信息读取文件块,并将文件块返回给客户端,客户端将多个文件块合并成完整的文件。 3. 文件删除: - 客户端向跟踪服务器发送文件删除请求,跟踪服务器根据文件名查找对应的存储服务器地址。 - 跟踪服务器通知存储服务器删除对应的文件块。 - 存储服务器删除文件块,并将删除成功的结果返回给跟踪服务器。 FastDFS通过将文件分割成块并分布式存储在多个存储服务器上,实现了高可用性和可扩展性。同时,通过跟踪服务器记录文件的元数据信息,实现了快速查找和定位文件的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舰长115

码字不易如果觉得还不错谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值