天天看点

Tomcat Valve使用

上一篇关于Listener理解成监听信息,那么Valve就是用来过滤信息用的,而最简单以及朴实无华的Valve非org.apache.catalina.valves.AccessLogValve莫属。

AccessLogValve的类图设计

Tomcat Valve使用

自定义的Valve

首先查看下实现ValveBase接口的Valve

Tomcat 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);
	}

}
           
Tomcat Valve使用

如何配置呢?类似的配置足矣!

<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 &quot;%r&quot; %s %b" />

      </Host>      

配置完毕后,运行http://127.0.0.1:8080

Tomcat Valve使用