通常您使用 .htaccess 来允许或阻止特定 IP 访问您的网站。这会随着 Java 托管而改变。当部分或全部请求被代理到 Tomcat 时,.htaccess 将无法为它们工作,因为根本不会咨询此类请求。
如果是这种情况,您需要在 Tomcat 级别阻止 IP。可用于web.xml
您的 Web 应用程序或全局应用程序的示例 IP 过滤器如下:
<filter>
<filter-name>Remote IP Filter</filter-name>
<filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
<init-param>
<param-name>deny</param-name>
<param-value>172\.20\.\d+\.\d+</param-value>
</init-param>```
<init-param>
<param-name>denyStatus</param-name>
<param-value>404</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Remote IP Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Remote IP Filter</filter-name>
<filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
<init-param>
<param-name>allow</param-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>denyStatus</param-name>
<param-value>404</param-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 Filter</filter-name>
<filter-class>net.jvmhost.test.IPFilter</filter-class>
<init-param>
<param-name>IP_REGEX</param-name>
<param-value>172\.20\.\d+\.\d+</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Custom Remote Address Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 重新启动 Tomcat 并测试过滤器。
所有路径、IP 和正则表达式都是示例,需要根据您的环境和需求进行定制。