• Tomcat 使用过滤器阻止 IP 地址


    通常您使用 .htaccess 来允许或阻止特定 IP 访问您的网站。这会随着 Java 托管而改变。当部分或全部请求被代理到 Tomcat 时,.htaccess 将无法为它们工作,因为根本不会咨询此类请求。

    如果是这种情况,您需要在 Tomcat 级别阻止 IP。可用于web.xml您的 Web 应用程序或全局应用程序的示例 IP 过滤器如下:

    1. <filter>
    2. <filter-name>Remote IP Filterfilter-name>
    3. <filter-class>org.apache.catalina.filters.RemoteAddrFilterfilter-class>
    4. <init-param>
    5. <param-name>denyparam-name>
    6. <param-value>172\.20\.\d+\.\d+param-value>
    7. init-param>```
    8. <init-param>
    9. <param-name>denyStatusparam-name>
    10. <param-value>404param-value>
    11. init-param>
    12. filter>
    13. <filter-mapping>
    14. <filter-name>Remote IP Filterfilter-name>
    15. <url-pattern>/*url-pattern>
    16. filter-mapping>
    1. <filter>
    2. <filter-name>Remote IP Filterfilter-name>
    3. <filter-class>org.apache.catalina.filters.RemoteAddrFilterfilter-class>
    4. <init-param>
    5. <param-name>allowparam-name>
    6. <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.11\.12\.\d+param-value>
    7. init-param>
    8. <init-param>
    9. <param-name>denyStatusparam-name>
    10. <param-value>404param-value>
    11. init-param>
    12. filter>

    如您所见,正则表达式可用于允许和拒绝参数值。这将允许您阻止所有 IP 范围。如果您跳过denyStatus参数,将使用其默认值 403。您可以定义多个过滤器并将它们应用于特定的 URL/servlet。定义过滤器后重新启动 Tomcat。

    阅读Apache Tomcat 7 Configuration Reference (7.0.109) - Container Provided Filters ,了解您可以使用的不同类型的过滤器。

    远程地址过滤器
    介绍

    远程地址过滤器允许您将提交此请求的客户端的 IP 地址与一个或多个 正则表达式进行比较,并允许请求继续或拒绝处理来自此客户端的请求。

    正则表达式的语法与“标准”通配符匹配的语法不同。Tomcat 使用该java.util.regex 软件包。有关支持的表达式的详细信息,请参阅 Java 文档。

    注意:使用 IPv6 地址过滤器时需要注意。此 Valve 正在处理的 IP 地址的格式取决于用于获取它的 API。如果地址是使用 Inet6Address 类从 Java 套接字获取的,则其格式为 x:x:x:x:x:x:x:x. 也就是说,localhost 的 IP 地址将0:0:0:0:0:0:0:1代替更广泛使用的 ::1. 请查阅您的访问日志以了解实际值。

    另请参阅:远程主机过滤器

    过滤器类名称

    远程地址过滤器的过滤器类名称是 org.apache.catalina.filters.RemoteAddrFilter 

    参数初始化

    远程地址过滤器支持以下初始化参数:

    属性描述
    allow

    与远程客户端的 IP 地址进行比较的正则表达式(使用java.util.regex)。如果指定了这个属性,远程地址必须匹配这个请求才能被接受。如果未指定此属性,则将接受所有请求,除非远程地址与deny 模式匹配。

    deny

    与远程客户端的 IP 地址进行比较的正则表达式(使用java.util.regex)。如果指定了这个属性,远程地址不能匹配这个请求才能被接受。如果未指定此属性,则请求接受仅由该accept属性控制。

    denyStatus

    拒绝拒绝请求时使用的 HTTP 响应状态代码。默认值为403。例如,它可以设置为 value 404

    例子

    仅允许从 localhost 连接的客户端访问:

    1. <filter>
    2. <filter-name>Remote Address Filterfilter-name>
    3. <filter-class>org.apache.catalina.filters.RemoteAddrFilterfilter-class>
    4. <init-param>
    5. <param-name>allowparam-name>
    6. <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>Remote Address Filterfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>

    您可以通过编写实现javax.servlet.Filter的类来自由地在 Java 中构建自己的过滤器。这是一个简单的 IP 过滤器示例 HOWTO。

    • 创建webapps/ROOT/WEB-INF/classes/net/jvmhost/test目录。
    • 保存IPFilter.java在目录中,内容如下:
    1. package net.jvmhost.test;```
    2. import java.io.IOException;
    3. import java.util.StringTokenizer;
    4. import javax.servlet.*;
    5. import javax.servlet.http.*;
    6. public class IPFilter implements Filter {
    7. private FilterConfig config;
    8. // the regex must define whole string to match - for example a substring without .* will not match
    9. // note the double backslashes that need to be present in Java code but not in web.xml
    10. private String IP_REGEX = "172\\.20\\.\\d+\\.\\d+.*";
    11. // private String IP_REGEX = "172\\.20\\..*";
    12. public void init(FilterConfig filterConfig) throws ServletException {```
    13. this.config = filterConfig;
    14. // optionally you can get regex from init parameter overwriting the class' private variable
    15. IP_REGEX = config.getInitParameter("IP_REGEX");
    16. }
    17. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    18. String ip = request.getRemoteAddr();
    19. HttpServletResponse httpResp = null;
    20. if (response instanceof HttpServletResponse) httpResp = (HttpServletResponse) response;
    21. if (ip.matches(IP_REGEX)) {
    22. httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,"Your own message 403 Forbidden");
    23. } else {
    24. chain.doFilter(request, response);
    25. }
    26. }
    27. public void destroy() {}
    28. }
    • 在包含上述文件的目录中编译它:
    javac -cp ~/appservers/apache-tomcat-7.0.28/lib/servlet-api.jar IPFilter.java
    • 最后加入ROOT/WEB-INF/web.xml
    1. <filter>
    2. <filter-name>Custom Remote Address Filterfilter-name>
    3. <filter-class>net.jvmhost.test.IPFilterfilter-class>
    4. <init-param>
    5. <param-name>IP_REGEXparam-name>
    6. <param-value>172\.20\.\d+\.\d+param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>Custom Remote Address Filterfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>
    • 重新启动 Tomcat 并测试过滤器。

    所有路径、IP 和正则表达式都是示例,需要根据您的环境和需求进行定制。

  • 相关阅读:
    perf性能分析
    Python爬虫基础(四):使用更方便的requests库
    [JAVAee]SpringBoot配置文件
    合并图片为pdf
    企业微信+SCRM的整体营销工作要如何形成合力?
    YOLO系列改进
    聊城农村生活污水处理之十四五规划方案介绍
    JAVA番剧资讯检索系统计算机毕业设计Mybatis+系统+数据库+调试部署
    双软认证的条件是什么
    自行开发一个安卓相册的功能说明
  • 原文地址:https://blog.csdn.net/allway2/article/details/126036939