详解SpringBoot实现fastdfs防盗链功能的示例代码

 更新时间:2022年10月10日 09:04:47   作者:huan1993  
我们可以通过fastdfs实现一个分布式文件系统,如果fastdfs部署在外网,那么任何一个人知道了上传接口,就可以实现文件的上传和访问。那么如何阻止他人访问我们fastdfs服务器上的文件呢?此处就需要使用fastdfs的防盗链功能,本文就来讲讲如何实现这一功能

1、背景

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

2、实现原理

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

2.1 开启防盗链

vim /etc/fdfs/http.conf

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

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

2.2 重启 nginx

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

2.3 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);
    }

3、测试

3.1 带正确token访问

3.2 带错误token访问

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

4、项目代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-fastdfs

到此这篇关于详解SpringBoot实现fastdfs防盗链功能的示例代码的文章就介绍到这了,更多相关SpringBoot实现fastdfs防盗链内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中的AutowireCandidateResolver的具体使用详解

    Spring中的AutowireCandidateResolver的具体使用详解

    这篇文章主要介绍了Spring中的AutowireCandidateResolver的具体使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 关于HashMap源码解读

    关于HashMap源码解读

    HashMap是基于哈希表的Map接口实现,主要用于存储键值对,它通过数组、链表和红黑树来实现,解决了哈希冲突问题,Java 8中,HashMap对数据结构进行了优化,引入红黑树来提高查找效率,此外,HashMap是非线程安全的,适用于单线程环境
    2024-09-09
  • Java将字符串String转换为整型Int的两种方式

    Java将字符串String转换为整型Int的两种方式

    这篇文章主要介绍了Java如何将字符串String转换为整型Int,在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2023-04-04
  • idea克隆maven项目的方法步骤(图文)

    idea克隆maven项目的方法步骤(图文)

    这篇文章主要介绍了idea克隆maven项目的方法步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • redis分布式锁RedissonLock的实现细节解析

    redis分布式锁RedissonLock的实现细节解析

    这篇文章主要介绍了redis分布式锁RedissonLock的实现细节解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Mybatis日志配置方式(slf4j、log4j、log4j2)

    Mybatis日志配置方式(slf4j、log4j、log4j2)

    这篇文章主要介绍了Mybatis日志配置方式(slf4j、log4j、log4j2),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java String字符串和Unicode字符相互转换代码

    Java String字符串和Unicode字符相互转换代码

    这篇文章主要介绍了Java String字符串和Unicode字符相互转换代码,需要的朋友可以参考下
    2014-10-10
  • IDEA创建Maven一直爆红无法下载的问题解决办法

    IDEA创建Maven一直爆红无法下载的问题解决办法

    这篇文章主要介绍了关于IDEA创建Maven一直爆红无法下载的问题的解决办法,文中图文结合的方式给大家讲解的非常详细,对大家解决办法非常有用,需要的朋友可以参考下
    2024-06-06
  • 一文学会处理SpringBoot统一返回格式

    一文学会处理SpringBoot统一返回格式

    这篇文章主要介绍了一文学会处理SpringBoot统一返回格式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 详解Spring bean的注解注入之@Autowired的原理及使用

    详解Spring bean的注解注入之@Autowired的原理及使用

    之前讲过bean注入是什么,也使用了xml的配置文件进行bean注入,这也是Spring的最原始的注入方式(xml注入).本文主要讲解的注解有以下几个:@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以参考下
    2021-06-06

最新评论