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

相关文章

  • Spring Boot 与DBunit 配合使用方法

    Spring Boot 与DBunit 配合使用方法

    这篇文章主要介绍了Spring Boot 与DBunit 配合使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • java返回前端树形结构数据的2种实现方式

    java返回前端树形结构数据的2种实现方式

    近期项目有个需求,需要将组织机构数据拼成树型结构返回至前端,下面这篇文章主要给大家介绍了关于java返回前端树形结构数据的2种实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Springboot actuator生产就绪功能实现解析

    Springboot actuator生产就绪功能实现解析

    这篇文章主要介绍了Springboot actuator生产就绪功能实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot+Vue实现数据添加功能

    SpringBoot+Vue实现数据添加功能

    这篇文章主要介绍了SpringBoot+Vue实现数据添加功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java使用MulticastSocket实现基于广播的多人聊天室

    java使用MulticastSocket实现基于广播的多人聊天室

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现基于广播的多人聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 关于intellij idea打开就闪退或关闭详细解决办法

    关于intellij idea打开就闪退或关闭详细解决办法

    这篇文章主要介绍了关于intellij idea打开就闪退或关闭详细解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java常见报错及解决方案总结

    java常见报错及解决方案总结

    这篇文章主要介绍了Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常、死锁和类未找到异常,文中通过代码将解决方案介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • Java编程泛型限定代码分享

    Java编程泛型限定代码分享

    这篇文章主要介绍了Java编程泛型限定的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot中使用Redis Stream实现消息监听示例

    SpringBoot中使用Redis Stream实现消息监听示例

    本文主要介绍了SpringBoot中使用Redis Stream实现消息监听示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • JavaScript中new运算符的实现过程解析

    JavaScript中new运算符的实现过程解析

    这篇文章主要介绍了JavaScript中new运算符的实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论