users@jersey.java.net

Re: [Jersey] Passing ContainerRequest headers to a resource

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Tue, 10 Nov 2009 09:32:22 +0100

On Nov 9, 2009, at 9:01 PM, Louis Polycarpou wrote:

> Hi,
>
> I'm using a ContainerRequestFilter impl which serves as a Security
> Filter and I wanted to use it to pass some custom properties to the
> request so that it is accessible from any resource e.g. using
> @Context injection on the HttpServletRequest.
>
> I've tried setting InBoundHeaders but this did not seem to work...
>
> Filter code:
>
> public class MyFilter implements ContainerRequestFilter {
>
> ...
> public ContainerRequest filter(ContainerRequest request) {
>
> InBoundHeaders hdr = new InBoundHeaders();
> hdr.addObject("myobj", obj);
>
> request.setHeaders(hdr);
> return request;
> }
> ...
> }
>

In the above you are setting header values on Jersey's request object.


> Resource code:
>
> @Path...
> ...
> public class BaseResource {
>
> @Context
> protected HttpServletRequest request;
>
> // Injection onto constructor parameter
> public BaseResource() {
> System.out.println("My obj is: " +
> request.getHeader("myobj")); // IS NULL
> }
> ...
> }
>

In the above you are setting header values on the Servlet request
object. Jersey does not sync between the Servlet request and it's own
request.

I recommend you utilize either servlet request attributes or Jersey
request attributes rather than add request headers.

Your filter can add Jersey request properties using
ContanerRequest.getProperties().

Your resource class can inject HttpContext and obtain the same
properties using HttpContext.getProperties.

Hth,
Paul.

> Have I missed a trick here or is there another way to do this?
>
> Thanks,
> Louis
>
> Louis Polycarpou (founder)
>
> <adjoovo-email.png>
> Adjoovo
> SERVICE-ORIENTED COLLABORATION
> http://adjoovo.com
> http://twitter.com/adjoovo
> +44 (0) 7786 136653
>
>
>