Java Filter防盗链:拦截直接访问与非法来源

Miles
Miles
发布时间:2026-10-13 | 3人浏览过
原创

针对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类,在请求到达目标资源前进行校验。

动作:

  1. 创建包路径如 com.fr.test。
  2. 实现doFilter方法,获取请求头的referer。
  3. 配置白名单逻辑:仅允许特定的域名或页面地址作为来源。
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安全配置的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表