1
0
forked from ruoyi/RuoYi-Vue

优化代码,支持防盗链功能

This commit is contained in:
2025-09-20 21:19:02 +08:00
parent 616e257617
commit 1b140fcc83
8 changed files with 530 additions and 481 deletions

View File

@@ -0,0 +1,63 @@
package com.devttl.common.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
* 防盗链过滤器
*
* @author ruoyi
*/
public class RefererFilter implements Filter {
/**
* 允许的域名列表
*/
public List<String> allowedDomains;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String domains = filterConfig.getInitParameter("allowedDomains");
this.allowedDomains = Arrays.asList(domains.split(","));
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String referer = req.getHeader("Referer");
// 如果Referer为空拒绝访问
if (referer == null || referer.isEmpty()) {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied: Referer header is required");
return;
}
// 检查Referer是否在允许的域名列表中
boolean allowed = false;
for (String domain : allowedDomains) {
if (referer.contains(domain)) {
allowed = true;
break;
}
}
// 根据检查结果决定是否放行
if (allowed) {
chain.doFilter(request, response);
} else {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied: Referer '" + referer + "' is not allowed");
}
}
@Override
public void destroy() {
}
}