2

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

下一步是配置server.xmlor context.xml。我都试过了。但是我的阀门类没有被检测到。

有人可以告诉我创建和使用阀门的步骤。

谢谢

4

3 回答 3

4

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

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

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

第五步:打开终端,运行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

包裹名字:com.keetmalin.tomcat

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

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

./catalina.sh run

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

在此处输入图像描述

于 2019-06-02T18:23:24.737 回答
1

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

于 2011-09-30T15:13:27.713 回答
0

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

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

server.xml我在该部分内的文件中添加了一个条目,<Host>如下所示:

<Valve className="org.apache.catalina.connector.MyValve"
    classField="value">
于 2012-09-17T15:16:52.443 回答