Tomcat Valve使用
上一篇关于Listener理解成监听信息,那么Valve就是用来过滤信息用的,而最简单以及朴实无华的Valve非org.apache.catalina.valves.AccessLogValve莫属。AccessLogValve的类图设计
自定义的Valve
首先查看下实现ValveBase接口的Valve
设计一个固定的ip和地址才能进来valve,如果按照传统方式有一下几种合适的方案
1.可能是在apache、nginx上进行拦截,确实这种方式最容易
2.类似的struts2、springMVC提供这种ip拦截的方案
今天我提供额外的方式,其实只是提供好玩的想法,具体用Vavle能够在那些方面,仁者见仁、智者见智。
Tomcat的valve的设计模式就是采用责任链模式,挺好用的设计模式。
import java.io.IOException;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.RequestFilterValve;
public final class EwellBlockAccessByPathValve extends RequestFilterValve {
private String path;
private Pattern[] paths;
@Override
public String getInfo() {
return info;
}
public String getPath() {
return path;
}
public void setPath(String path) {
paths = precalculate(path);
this.path = path;
}
@Override
public void invoke(Request request, Response response) throws IOException,
ServletException {
System.out.println("---------------EwellBlockAccessByPathValve-----------------");
String remoteAddr = request.getRemoteAddr();
String requestedPath = request.getRequestURI();
boolean pathBlocked = false;
getNext().invoke(request, response);
}
}
如何配置呢?类似的配置足矣!
<Host name="localhost"appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
配置完毕后,运行http://127.0.0.1:8080
页:
[1]