Class ParameterLimitValve

All Implemented Interfaces:
MBeanRegistration, Contained, JmxEnabled, Lifecycle, Valve

public class ParameterLimitValve extends ValveBase
This is a concrete implementation of ValveBase that enforces a limit on the number of HTTP request parameters. The features of this implementation include:
  • URL-specific parameter limits that can be defined using regular expressions
  • Configurable through Tomcat's server.xml or context.xml
  • Requires a parameter_limit.config file containing the URL-specific parameter limits. It must be placed in the Host configuration folder or in the WEB-INF folder of the web application.

The default limit, specified by Connector's value, applies to all requests unless a more specific URL pattern is matched. URL patterns and their corresponding limits can be configured via a regular expression mapping through the urlPatternLimits attribute.

The Valve checks each incoming request and enforces the appropriate limit. If a request exceeds the allowed number of parameters, a 400 Bad Request response is returned.

Example, configuration in context.xml:

 
 <Context>
     <Valve className="org.apache.catalina.valves.ParameterLimitValve"
 </Context>
 
 and in parameter_limit.config:
 
 
 /api/.*=150
 /admin/.*=50
 
 

The configuration allows for flexible control over different sections of your application, such as applying higher limits for API endpoints and stricter limits for admin areas.

Author:
Dimitris Soumis
  • Field Details

    • urlPatternLimits

      protected Map<Pattern,Integer> urlPatternLimits
      Map for URL-specific limits
    • resourcePath

      protected String resourcePath
      Relative path to the configuration file. Note: If the valve's container is a context, this will be relative to /WEB-INF/.
    • context

      protected boolean context
      Will be set to true if the valve is associated with a context.
  • Constructor Details

    • ParameterLimitValve

      public ParameterLimitValve()
  • Method Details

    • getResourcePath

      public String getResourcePath()
    • setResourcePath

      public void setResourcePath(String resourcePath)
    • initInternal

      protected void initInternal() throws LifecycleException
      Description copied from class: LifecycleBase
      Sub-classes implement this method to perform any instance initialisation required.
      Overrides:
      initInternal in class ValveBase
      Throws:
      LifecycleException - If the initialisation fails
    • startInternal

      protected void startInternal() throws LifecycleException
      Description copied from class: ValveBase
      Start this component and implement the requirements of LifecycleBase.startInternal().
      Overrides:
      startInternal in class ValveBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • setUrlPatternLimits

      public void setUrlPatternLimits(String urlPatternConfig)
    • setUrlPatternLimits

      public void setUrlPatternLimits(BufferedReader reader)
      Set the mapping of URL patterns to their corresponding parameter limits. The input should be provided line by line, where each line contains a pattern and a limit, separated by the last '='.

      Example:

       /api/.*=50
       /api======/.*=150
       /urlEncoded%20api=2
       # This is a comment
       
      Parameters:
      reader - A BufferedReader containing URL pattern to parameter limit mappings, with each pair on a separate line.
    • stopInternal

      protected void stopInternal() throws LifecycleException
      Description copied from class: ValveBase
      Stop this component and implement the requirements of LifecycleBase.stopInternal().
      Overrides:
      stopInternal in class ValveBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • invoke

      public void invoke(Request request, Response response) throws IOException, ServletException
      Checks if any of the defined patterns matches the URI of the request and if it does, enforces the corresponding parameter limit for the request. Then invoke the next Valve in the sequence.
      Parameters:
      request - The servlet request to be processed
      response - The servlet response to be created
      Throws:
      IOException - if an input/output error occurs
      ServletException - if a servlet error occurs