当前位置: 代码网 > it编程>编程语言>Java > springboot实现防盗链功能的示例代码

springboot实现防盗链功能的示例代码

2024年12月19日 Java 我要评论
防盗链(hotlink protection)是一种防止其他网站直接链接到你网站的资源(如图片、视频等),从而节省带宽和保护内容的有效手段。在spring boot应用程序中实现防盗链功能,可以通过多

防盗链(hotlink protection)是一种防止其他网站直接链接到你网站的资源(如图片、视频等),从而节省带宽和保护内容的有效手段。在spring boot应用程序中实现防盗链功能,可以通过多种方式来达成,例如使用过滤器(filter)、拦截器(interceptor),或者通过配置nginx等反向代理服务器。

以下是几种实现防盗链的方法:

1. 使用过滤器(filter)

你可以创建一个自定义过滤器,在请求到达实际资源之前检查http头中的`referer`字段。如果`referer`不在允许的域名列表中,则返回403 forbidden响应或重定向到其他页面。

import javax.servlet.filter;
import javax.servlet.filterchain;
import javax.servlet.filterconfig;
import javax.servlet.servletexception;
import javax.servlet.servletrequest;
import javax.servlet.servletresponse;
import javax.servlet.http.httpservletrequest;
import java.io.ioexception;

public class hotlinkprotectionfilter implements filter {

    private final string[] alloweddomains = {"yourdomain.com"};

    @override
    public void init(filterconfig filterconfig) throws servletexception {}

    @override
    public void dofilter(servletrequest request, servletresponse response, filterchain chain)
            throws ioexception, servletexception {
        httpservletrequest httprequest = (httpservletrequest) request;
        string referer = httprequest.getheader("referer");

        // allow if there's no referer (like direct access or bookmarks)
        if (referer == null || arrays.stream(alloweddomains).anymatch(referer::contains)) {
            chain.dofilter(request, response);
        } else {
            httpservletresponse httpresponse = (httpservletresponse) response;
            httpresponse.senderror(httpservletresponse.sc_forbidden, "hotlinking not allowed");
        }
    }

    @override
    public void destroy() {}
}

然后你需要将这个过滤器注册到spring的上下文中:

import org.springframework.boot.web.servlet.filterregistrationbean;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration
public class webconfig {

    @bean
    public filterregistrationbean<hotlinkprotectionfilter> loggingfilter(){
        filterregistrationbean<hotlinkprotectionfilter> registrationbean = new filterregistrationbean<>();

        registrationbean.setfilter(new hotlinkprotectionfilter());
        registrationbean.addurlpatterns("/resources/*"); // 替换为你的资源路径

        return registrationbean;
    }
}

2. 使用拦截器(interceptor)

如果你更倾向于mvc模式,可以创建一个拦截器来执行相同的逻辑:

import org.springframework.stereotype.component;
import org.springframework.web.servlet.handlerinterceptor;
import org.springframework.web.servlet.modelandview;

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

@component
public class hotlinkprotectioninterceptor implements handlerinterceptor {

    private final string[] alloweddomains = {"yourdomain.com"};

    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        string referer = request.getheader("referer");

        if (referer == null || arrays.stream(alloweddomains).anymatch(referer::contains)) {
            return true;
        } else {
            response.senderror(httpservletresponse.sc_forbidden, "hotlinking not allowed");
            return false;
        }
    }

    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {}

    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {}
}

接着,需要注册该拦截器:

import org.springframework.beans.factory.annotation.autowired;
import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.interceptorregistry;
import org.springframework.web.servlet.config.annotation.webmvcconfigurer;

@configuration
public class webconfig implements webmvcconfigurer {

    @autowired
    private hotlinkprotectioninterceptor hotlinkprotectioninterceptor;

    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(hotlinkprotectioninterceptor).addpathpatterns("/resources/**");
    }
}

3. 配置nginx

如果你的应用程序是通过nginx或其他反向代理服务器访问的,那么可以在nginx配置文件中添加防盗链规则,这种方法通常更为高效:

location /resources/ {
    valid_referers none blocked yourdomain.com *.yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}

这三种方法都可以有效地防止其他网站直接链接到你的资源。选择哪种方法取决于你的具体需求和技术栈。

以上就是springboot实现防盗链功能的示例代码的详细内容,更多关于springboot防盗链功能的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com