防盗链(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防盗链功能的资料请关注代码网其它相关文章!
发表评论