users@jersey.java.net

Re: [Jersey] Using filters

From: James Strachan <james.strachan_at_gmail.com>
Date: Tue, 10 Feb 2009 16:21:33 +0000

2009/2/3 Paul Sandoz <Paul.Sandoz_at_sun.com>:
> Hi,
>
> I have managed to achieve some progress with filters. My latest commit
> modifies ServletContainer to be a Servlet or a Filter depending on where you
> use it. The same Servlet behavior is supported as before.
>
> The filter behavior is currently very simple:
>
> - the filter needs to be declared at the end of the filter chain. It does
> not pass on processing to the next filter in the chain, if
> any is configured.
>
> - the base URI is set to:
>
> http:://<host>:<port>/<context path>/
>
> so even if your filter is configured to filter say "resources/*" the
> "resources" path segment will not be considered part of the
> base URI.
>
> IIUC to support such behavior we need to support an init-param that
> declares a filter context path.
>
> - the same initialization parameters as for servlet initialization apply.
>
> Since the SpringServlet extends from ServletContainer it can also be used as
> a filter.
>
> Thus it should be possible to add a filter before the ServletContainer
> filter to forward to static resources.
>
> If people could try this out it when a new build appears on the repo that
> would be much appreciated. The following is the web.xml of the bookstore
> sample modified to use the filter:
>
> <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
> version="2.4">
> <filter>
> <filter-name>Jersey Filter</filter-name>
>
> <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
> <init-param>
> <param-name>com.sun.jersey.config.feature.Redirect</param-name>
> <param-value>true</param-value>
> </init-param>
> <init-param>
>
> <param-name>com.sun.jersey.config.feature.ImplicitViewables</param-name>
> <param-value>true</param-value>
> </init-param>
> <init-param>
> <param-name>com.sun.jersey.config.property.packages</param-name>
>
> <param-value>com.sun.jersey.samples.bookstore.resources</param-value>
> </init-param>
> </filter>
> <filter-mapping>
> <filter-name>Jersey Filter</filter-name>
> <url-pattern>/*</url-pattern>
> </filter-mapping>
> </web-app>

I tried patching the web.xml of the bookstore sample to use this
web.xml and it seems to work perfectly - apart from allowing static
files through.

I've raised issue 208 with a patch...
https://jersey.dev.java.net/issues/show_bug.cgi?id=208

which adds a String property to the Jersey filter to allow a regex to
be used to filter on the servlet path to allow things to be excluded.
For example setting the value of the regex to

/(images|css|js)/.*

will allow most static content through on most web apps. I've patched
the bookstore sample to have a simple CSS file then I use this
configuration property in the web.xml to allow Jersey to let the
default web container render static content while Jersey deals with
the JAX-RS resources. There's a simple test case included too.

-- 
James
-------
http://macstrac.blogspot.com/
Open Source Integration
http://fusesource.com/