实现Tomcat自定义阀门

时间:2011-07-04 15:19:27

标签: tomcat6 tomcat-valve

我正在尝试在Tomcat中实现一个自定义阀门,说MyValve扩展了BaseValve。 我创建了一个项目jar,将其添加到Tomcat \ lib文件夹

下一步是配置server.xml或context.xml 我试过了两个 但我的阀门类没有被发现......

有人可以让我知道创建阀门并使用它的步骤。

谢谢

3 个答案:

答案 0 :(得分:1)

你在运行什么版本的Tomcat? CATALINA_HOME\lib是Tomcat v6.x的正确目录(我相信v7)。如果您的阀门没有被拿起,可能是您没有编辑server.xml目录中的context.xmlCATALINA_BASE文件。您使用的是Eclipse IDE还是类似的东西?如果是,请检查Tomcat服务器设置,因为它将XML文件从CATALINA_HOME(安装)复制到CATALINA_BASE(已配置的实例)目录。这个问题让我吵了一阵。

答案 1 :(得分:1)

问题在于创建和使用自定义阀所需的步骤。因此,让我逐步解释它,以便其他人也可以利用它。在我的示例中,我将使用 Java Maven项目。 (Git Project

第1步:打开一个新的或现有的Maven项目(也可以从上面的仓库中克隆)。

第2步:将以下依赖项添加到pom.xml文件中。

<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>7.0.85</version>
            <scope>provided</scope>
</dependency>

步骤3 :在src/main/java路径下,创建一个包并创建一个新的Java类:TomcatValve.java(可以是任何名称)。通过ValueBase类扩展该类。

第4步:这样,您将必须实现其invoke方法。整个类看起来类似于以下内容:

import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

/**
 * @author Keet Sugathadasa
 */
public class TomcatValve extends ValveBase {
    private static final Logger logger = Logger.getLogger(TomcatValve.class.getName());

    public void invoke(Request request, Response response) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = request.getRequest();

        Enumeration<String> headerNames = httpServletRequest.getHeaderNames();

        logger.info("Receiving request");

        while (headerNames.hasMoreElements()) {
            String header = headerNames.nextElement();
            logger.log(Level.INFO, "Header --> {0} Value --> {1}", new Object[]{header, httpServletRequest.getHeader(header)});
        }

        getNext().invoke(request, response);
    }
}

步骤5 :打开一个终端,然后运行mvn install。现在,在target/文件夹中,应该已经建立了jar。

步骤6 :将此jar复制到${TOMCAT_HOME}/lib${CATALINA_HOME}/lib文件夹中。通常在/usr/local/apache-tomcat9/lib中。

第7步:转到${TOMCAT_HOME}/conf${CATALINA_HOME}/conf文件夹,然后将以下行添加到server.xml

类名:TomcatValve

PackageName:com.keetmalin.tomcat

<Valve className="com.keetmalin.tomcat.TomcatValve"/>

步骤9 :转到${TOMCAT_HOME}/bin${CATALINA_HOME}/bin文件夹,然后在终端中运行以下命令:

./catalina.sh run

步骤10 :接下来,您的Tomcat服务器将启动。打开浏览器,然后转到http://localhost:8080/,然后返回到终端。您将看到正在打印日志。现在,您可以执行任何您想做的事情,而不必打印日志。希望对您有帮助!

enter image description here

答案 2 :(得分:0)

我发现我创建了一个包含java文件的jar,而不是使用netbeans的类文件。

对我有用的解决方案是创建一个具有正确的包目录结构的jar(MyValve.jar \ org \ apache \ catalina \ connector),并将类文件粘贴到该目录中。我把jar放在同一个位置(CATALINA_HOME \ lib)。

我在以下部分的server.xml文件中添加了一个条目:

<Valve className="org.apache.catalina.connector.MyValve"
    classField="value">