Custom valves are invoked before Catalina has mapped the request at whatever
level you put it at in your server.xml.  This means that if you put it
inside of your Context declaration, then getContextPath should work, but
getServletPath won't.  Placing it any higher up, then getContextPath won't
work.

Unless you *really* need access to Catalina internals, I'd strongly
recommend using a Filter instead of a Valve.  They are functionally similar,
but you're state in a Filter is much easier to understand.  Also, using a
Filter means that you are not tied to one particular version of Tomcat (or,
even to Tomcat at all :).

----- Original Message -----
From: "Jeff Wishnie" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, September 19, 2002 11:35 AM
Subject: 4.1.10: Bug in handling of custom valves?


> I am not sure if this is more appropriate for the user list, I will rely
on the new moderator to redirect it as he sees fit (thank
> you).
>
> I am implementing a custom valve that adds some information to inbound
requests. I've noticed a strange behavior as follows:
>
> Certain calls on the HttpServletRequest object seem to cause the request
processing chain to fail--the request is never delivered to
> the appropriate servlet, and Tomcat returns a well-formatted, but blank,
HTML page to the client.
>
> The following calls cause this behavior:
>
> getServletPath()
> getSession(boolean create)
> getContextPath()
>
> The following call _does_ not exhibit this behavior--the request is
distributed properly:
> getRequestURL()
>
>
> For example, the following code snippet causes the failure:
>
> public void invoke(Request request, Response response, ValveContext
context)
>         throws IOException, ServletException {
>
>         if (!(request instanceof HttpRequest) ||
>             !(response instanceof HttpResponse)) {
>             context.invokeNext(request, response);
>             return;
>         }
>
>         String reqPath=((HttpServletRequest)
request.getRequest()).getServletPath();
>         if (reqPath.equals("/login")) {
>             // do nothing
>             context.invokeNext(request, response);
>             return;
>         }
>
>     // do actual work
>     context.invokeNext(request, response);
> }
>
> If I replace the call to "getServletPath()" with "getRequestURL()", the
request is processed properly.
>
> Is this a bug? Are their certain "illegal" calls on the request object
that break the valve chain?
>
> My work around for now is to parse the requestURL myself rather than using
the convenience functions, but I can't find a work around
> to not being able to access the Session.
>
> Thanks in advance for any help.
>
> - Jeff Wishnie
> [EMAIL PROTECTED]
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to