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

 更新时间:2024年12月18日 10:25:21   作者:Mercury_@22  
防盗链(Hotlink Protection)是一种防止其他网站直接链接到你网站的资源,从而节省带宽和保护内容的有效手段,下面我们就来看看如何使用springboot实现防盗链功能吧

防盗链(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防盗链功能的资料请关注脚本之家其它相关文章!

相关文章

  • Java实现一键将Word文档转为PDF

    Java实现一键将Word文档转为PDF

    在开发中,经常会碰到需要把 Word 文档转换成 PDF 格式的需求,Java 有不少好用的库能实现这个功能,本文为大家介绍了两个常用的方法,需要的可以了解下
    2025-02-02
  • springboot1.X和2.X中如何解决Bean名字相同时覆盖

    springboot1.X和2.X中如何解决Bean名字相同时覆盖

    这篇文章主要介绍了springboot1.X和2.X中如何解决Bean名字相同时覆盖,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • struts2实现多文件上传的示例代码

    struts2实现多文件上传的示例代码

    本篇文章主要介绍了struts2实现多文件上传的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Spring 日志规范及作用

    Spring 日志规范及作用

    日志是在系统运行过程中关键的节点的数,这个些日志的记录方便当系统出现问题方便问题查找,这篇文章主要介绍了Spring 日志规范及作用,需要的朋友可以参考下
    2024-03-03
  • java使用spring实现发送mail的方法

    java使用spring实现发送mail的方法

    这篇文章主要介绍了java使用spring实现发送mail的方法,涉及java基于spring框架发送邮件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Java如何实现Unicode和中文相互转换

    Java如何实现Unicode和中文相互转换

    这篇文章主要介绍了Java如何实现Unicode和中文相互转换问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    两万字详解Java Sring String的常见操作以及StringBuffer StringBuilder的区别

    本篇文章带你认识Sring、String的常见操作和StringBuffer 与StringBuilder的区别(字符串详解),对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java使用分隔符连接数组中每个元素的实例

    java使用分隔符连接数组中每个元素的实例

    今天小编就为大家分享一篇java使用分隔符连接数组中每个元素的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Spring根据XML配置文件 p名称空间注入属性的实例

    Spring根据XML配置文件 p名称空间注入属性的实例

    下面小编就为大家分享一篇Spring根据XML配置文件 p名称空间注入属性的实例,具有很好的参考价值。希望对大家有所帮助
    2017-11-11
  • MyBatisPlus的autoResultMap生成策略实现

    MyBatisPlus的autoResultMap生成策略实现

    本文主要介绍了MyBatisPlus的autoResultMap生成策略实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02

最新评论