Skip to content

This repository contains a simple maven project with a class extended by tomcat ValueBase, to demonstrate on how to implement a custom valve in tomcat.

License

Notifications You must be signed in to change notification settings

Keetmalin/Tomcat-Valve-Example

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tomcat-Valve-Example

This repository contains a simple maven project with a class extended by tomcat ValueBase, to demonstrate on how to implement a custom valve in tomcat.

This is based as an answer for the following question: https://stackoverflow.com/questions/6573325/implementing-tomcat-custom-valve

The question is on steps required to create a custom valve and use it. So let me explain it step by step for someone else also to take advantage of it. For my example, I will use a Java Maven Project. (Git Project)

Step 1: Open a new or existing maven project (you can also clone from the above repo).

Step 2: Add the following dependency to the pom.xml file.

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

Step 3: Under src/main/java path, create a package and create a new Java Class: TomcatValve.java (could be any name). Extend this class by ValueBase class.

Step 4: With this, you will have to implement its invoke method. The entire class would look something similar to this:

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

Step 5: Open a terminal, and run mvn install. Now in the target/ folder, there jar should have been built.

Step 6: Copy this jar to ${TOMCAT_HOME}/lib or ${CATALINA_HOME}/lib folder. This is usually in /usr/local/apache-tomcat9/lib.

Step 7: Go to ${TOMCAT_HOME}/conf or ${CATALINA_HOME}/conf folder and add the following line to server.xml:

Classname: TomcatValve

PackageName: com.keetmalin.tomcat

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

Step 9: Go to ${TOMCAT_HOME}/bin or ${CATALINA_HOME}/bin folder and run the following command in a terminal:

./catalina.sh run

Step 10: Next, your Tomcat server will start. Open a browser and go to http://localhost:8080/ and go back to the terminal. You will see that the logs are being printed. Now instead of printing logs, you can do anything you wish. Hope it helps!

enter image description here

About

This repository contains a simple maven project with a class extended by tomcat ValueBase, to demonstrate on how to implement a custom valve in tomcat.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages