<?xml version="1.0"?>
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="ajp.html">

  &project;

  <properties>
    <author email="remm@apache.org">Remy Maucherat</author>
    <author email="yoavs@apache.org">Yoav Shapira</author>
    <title>The AJP Connector</title>
  </properties>

<body>


<section name="Introduction">

  <p>The <strong>AJP Connector</strong> element represents a
  <strong>Connector</strong> component that communicates with a web
  connector via the <code>AJP</code> protocol.  This is used for cases
  where you wish to invisibly integrate Tomcat 5 into an existing (or new)
  Apache installation, and you want Apache to handle the static content
  contained in the web application, and/or utilize Apache's SSL
  processing.</p>

  <p>This connector supports load balancing when used in conjunction with
  the <code>jvmRoute</code> attribute of the 
  <a href="engine.html">Engine</a>.</p>

  <p>On the native side, Tomcat 5.5 supports the following connectors:</p>
  <ul>
  <li>mod_jk 1.2.x with any of its supported native servers</li>
  <li>Apache httpd 2.2 with mod_proxy configured for AJP</li>
  </ul>
  <p>Other native connectors supporting AJP/1.3 may work, but are no longer
  supported.</p>

</section>


<section name="Attributes">

  <subsection name="Common Attributes">

  <p>All implementations of <strong>Connector</strong>
  support the following attributes:</p>

  <attributes>

    <attribute name="address" required="false">
      <p>For servers with more than one IP address, this attribute
      specifies which address will be used for listening on the specified
      port.  By default, this port will be used on all IP addresses
      associated with the server.</p>
    </attribute>

    <attribute name="allowTrace" required="false">
      <p>A boolean value which can be used to enable or disable the TRACE
      HTTP method. If not specified, this attribute is set to false.</p>
    </attribute>

    <attribute name="enableLookups" required="false">
      <p>Set to <code>true</code> if you want calls to
      <code>request.getRemoteHost()</code> to perform DNS lookups in
      order to return the actual host name of the remote client.  Set
      to <code>false</code> to skip the DNS lookup and return the IP
      address in String form instead (thereby improving performance).
      By default, DNS lookups are enabled.</p>
    </attribute>

    <attribute name="maxPostSize" required="false">
      <p>The maximum size in bytes of the POST which will be handled by 
      the container FORM URL parameter parsing. The feature can be disbled by 
      setting this attribute to a value inferior or equal to 0. 
      If not specified, this attribute is set to 2097152 (2 megabytes).</p>
    </attribute>

    <attribute name="redirectPort" required="false">
      <p>If this <strong>Connector</strong> is supporting non-SSL
      requests, and a request is received for which a matching
      <code>&lt;security-constraint&gt;</code> requires SSL transport,
      Catalina will automatically redirect the request to the port
      number specified here.</p>
    </attribute>

    <attribute name="scheme" required="false">
      <p>Set this attribute to the name of the protocol you wish to have
      returned by calls to <code>request.getScheme()</code>.  For
      example, you would set this attribute to "<code>https</code>"
      for an SSL Connector.  The default value is "<code>http</code>".</p>
    </attribute>

    <attribute name="secure" required="false">
      <p>Set this attribute to <code>true</code> if you wish to have
      calls to <code>request.isSecure()</code> to return <code>true</code>
      for requests received by this Connector (you would want this on an
      SSL Connector).  The default value is <code>false</code>.</p>
    </attribute>

    <attribute name="URIEncoding" required="false">
      <p>This specifies the character encoding used to decode the URI bytes,
      after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
      </p>
    </attribute>

    <attribute name="useBodyEncodingForURI" required="false">
      <p>This specifies if the encoding specified in contentType should be used
      for URI query parameters, instead of using the URIEncoding. This 
      setting is present for compatibility with Tomcat 4.1.x, where the 
      encoding specified in the contentType, or explicitely set using 
      Request.setCharacterEncoding method was also used for the parameters from
      the URL. The default value is <code>false</code>.
      </p>
    </attribute>

  </attributes>

  </subsection>

  <subsection name="Standard Implementation">

  <p>The standard implementation of <strong>AJP Connector</strong> is
  <strong>org.apache.coyote.tomcat5.CoyoteConnector</strong>, but you
  must specify the protocol attribute (see below).</p>

  <p><strong>This implementation supports the AJP 1.3 protocol.</strong></p>

  <p>It supports the following additional attributes (in addition to the
  common attributes listed above):</p>

  <attributes>

    <attribute name="protocol" required="true">
      <p>This attribute value must be <code>AJP/1.3</code> to use the AJP
      handler.</p>
    </attribute>

  </attributes>

  </subsection>

</section>


<section name="Nested Components">

  <p>None at this time.</p>

</section>


</body>

</document>
