Search code examples
tomcatservletstomcat7

Use a different adapter in tomcat


I want to configure tomcat 7 to use a different adapter than default CoyoteAdapter to handle some malformed cookies. Is that possible?

The reason is we are getting below exception

SEVERE: Error processing request
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
    at org.apache.tomcat.util.http.CookieSupport.isHttpSeparator(CookieSupport.java:205)
    at org.apache.tomcat.util.http.Cookies.getTokenEndPosition(Cookies.java:530)
    at org.apache.tomcat.util.http.Cookies.processCookieHeader(Cookies.java:377)
    at org.apache.tomcat.util.http.Cookies.processCookies(Cookies.java:195)
    at org.apache.tomcat.util.http.Cookies.getCookieCount(Cookies.java:119)
    at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1089)
    at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:796)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:440)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

Solution

  • You cannot change the coyote adapter, unless you implement your own org.apache.coyote.Processor. But in tomcat-8, you can change the cookie processor:

    1. Implement org.apache.tomcat.util.http.CookieProcessor
    2. Put the jar in tomcat's lib folder
    3. Configure tomcat to use your own cookie processor, by putting it in a context.xml:
    <Context>
        <CookieProcessor className="org.example.MonsterCookieProcessor"/>
    <Context>
    

    Sadly you cannot do that in tomcat-7, because the cookie processor logic is hardcoded in the CoyoteRequest:

        private Cookies cookies = new Cookies(headers);