package com.ard.file.filter; import java.io.IOException; import java.util.Arrays; import java.util.List; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; /** * 防盗链过滤器 * * @author ard */ public class RefererFilter implements Filter { /** * 允许的域名列表 */ public List 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() { } }