Java Filter防盗链:拦截直接访问与非法来源
针对FineReport等Web报表系统,直接输入URL访问存在安全隐患。本文演示如何通过编写Java Servlet Filter,校验HTTP请求头中的Referer字段,实现基于来源页面的防盗链控制,确保只有指定入口可访问报表资源。
防盗链原理:检测Referer头
Referer(注:规范拼写为Referer)是HTTP协议的一个请求头字段,用于指示当前请求是从哪个网页链接过来的。在防盗链场景中,我们可以利用这一机制区分“正常页面跳转”与“直接访问”。
空Referer的产生场景
当用户直接在浏览器地址栏输入URL、通过书签打开、或通过JavaScript window.location跳转时,HTTP请求中通常不包含Referer头部,或者其值为空。这被视为一种不受信任的访问方式。
防盗链策略通常有两种:
1. 允许空Referer:允许直接访问,仅校验特定来源。
2. 不允许空Referer:直接访问被拦截,必须从指定页面跳转进入。
实施步骤:配置Filter拦截请求
以下操作基于Tomcat容器与FineReport环境演示,核心逻辑适用于任何Java Web应用。
第1步:编写Filter类验证来源
目的:创建一个实现了javax.servlet.Filter接口的Java类,在请求到达目标资源前进行校验。
动作:
- 创建包路径如
com.fr.test。 - 实现
doFilter方法,获取请求头的referer。 - 配置白名单逻辑:仅允许特定的域名或页面地址作为来源。
package com.fr.test;
import java.io.IOException;
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 javax.servlet.http.HttpServletResponse;
public class Dodo implements Filter {
public void destroy() {}
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");
// 校验逻辑:非空且以指定域名开头
if(null != referer && (referer.trim().startsWith("http://localhost:8033")
|| referer.trim().startsWith("http://www.finereporthelp.com/test/hello.html"))) {
chain.doFilter(req, resp);
} else {
// 拦截非法请求,转发至错误/登录页
req.getRequestDispatcher("/LdapLogin.jsp").forward(req, resp);
}
}
public void init(FilterConfig arg0) throws ServletException {}
}
编译生成的 .class 文件需放置在Tomcat项目的对应类路径下,例如:%TOMCAT_HOME%\webapps\WebReport\WEB-INF\classes\com\fr\test\Dodo.class
第2步:修改web.xml注册过滤器
目的:让Tomcat服务器识别上述Filter,并作用于报表服务接口。
入口:%TOMCAT_HOME%\webapps\WebReport\WEB-INF\web.xml
动作:添加<filter>与<filter-mapping>节点,将过滤器绑定到 /ReportServer 路径。
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.fr.test.Dodo</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/ReportServer</url-pattern>
</filter-mapping>
效果验证与排错
准备两个HTML测试页:hello.html(合法来源,包含正确Referer)和 steal.html(非法来源,或模拟直接访问)。
情况一:合法来源跳转
从 hello.html 点击链接访问报表。此时Referer匹配白名单,Filter放行,报表正常加载。


情况二:非法来源跳转
从 steal.html 或其他未授权页面点击链接。如果来源URL不在白名单内,请求被拦截,跳转至配置的 LdapLogin.jsp(此处实际可能表现为404或登录页)。


情况三:直接访问URL(空Referer)
在浏览器地址栏直接输入 ReportServer 地址。由于没有Referer,判定为非法访问,被成功拦截。
如需更精细的数据权限控制,可结合Session注入或单点登录(SSO)方案进一步处理。
以上就是Java Servlet Filter实现防盗链拦截的直接访问与非法来源的详细内容,更多关于Java Web安全配置的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













