通常您使用 .htaccess 来允许或阻止特定 IP 访问您的网站。这会随着 Java 托管而改变。当部分或全部请求被代理到 Tomcat 时,.htaccess 将无法为它们工作,因为根本不会咨询此类请求。
如果是这种情况,您需要在 Tomcat 级别阻止 IP。可用于web.xml您的 Web 应用程序或全局应用程序的示例 IP 过滤器如下:
- <filter>
- <filter-name>Remote IP Filterfilter-name>
- <filter-class>org.apache.catalina.filters.RemoteAddrFilterfilter-class>
- <init-param>
- <param-name>denyparam-name>
- <param-value>172\.20\.\d+\.\d+param-value>
- init-param>```
-
- <init-param>
- <param-name>denyStatusparam-name>
- <param-value>404param-value>
- init-param>
- filter>
-
- <filter-mapping>
- <filter-name>Remote IP Filterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
- <filter>
- <filter-name>Remote IP Filterfilter-name>
- <filter-class>org.apache.catalina.filters.RemoteAddrFilterfilter-class>
-
- <init-param>
- <param-name>allowparam-name>
- <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.11\.12\.\d+param-value>
- init-param>
-
-
- <init-param>
- <param-name>denyStatusparam-name>
- <param-value>404param-value>
- init-param>
- filter>
如您所见,正则表达式可用于允许和拒绝参数值。这将允许您阻止所有 IP 范围。如果您跳过denyStatus参数,将使用其默认值 403。您可以定义多个过滤器并将它们应用于特定的 URL/servlet。定义过滤器后重新启动 Tomcat。
阅读Apache Tomcat 7 Configuration Reference (7.0.109) - Container Provided Filters ,了解您可以使用的不同类型的过滤器。
| 远程地址过滤器 | ||||||||||||||||
|
您可以通过编写实现javax.servlet.Filter的类来自由地在 Java 中构建自己的过滤器。这是一个简单的 IP 过滤器示例 HOWTO。
webapps/ROOT/WEB-INF/classes/net/jvmhost/test目录。IPFilter.java在目录中,内容如下:- package net.jvmhost.test;```
-
- import java.io.IOException;
- import java.util.StringTokenizer;
- import javax.servlet.*;
- import javax.servlet.http.*;
-
- public class IPFilter implements Filter {
- private FilterConfig config;
- // the regex must define whole string to match - for example a substring without .* will not match
- // note the double backslashes that need to be present in Java code but not in web.xml
- private String IP_REGEX = "172\\.20\\.\\d+\\.\\d+.*";
- // private String IP_REGEX = "172\\.20\\..*";
- public void init(FilterConfig filterConfig) throws ServletException {```
- this.config = filterConfig;
- // optionally you can get regex from init parameter overwriting the class' private variable
- IP_REGEX = config.getInitParameter("IP_REGEX");
- }
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
- String ip = request.getRemoteAddr();
- HttpServletResponse httpResp = null;
- if (response instanceof HttpServletResponse) httpResp = (HttpServletResponse) response;
- if (ip.matches(IP_REGEX)) {
- httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,"Your own message 403 Forbidden");
- } else {
- chain.doFilter(request, response);
- }
- }
- public void destroy() {}
- }
javac -cp ~/appservers/apache-tomcat-7.0.28/lib/servlet-api.jar IPFilter.java
ROOT/WEB-INF/web.xml:- <filter>
- <filter-name>Custom Remote Address Filterfilter-name>
- <filter-class>net.jvmhost.test.IPFilterfilter-class>
- <init-param>
- <param-name>IP_REGEXparam-name>
- <param-value>172\.20\.\d+\.\d+param-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>Custom Remote Address Filterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
所有路径、IP 和正则表达式都是示例,需要根据您的环境和需求进行定制。