Using javax.servlet.Filter with Compojure

I am trying to create a simple website using Clojure / Compojure and want to provide a servlet filter to the request / response (i.e. a standard instance of javax.servlet.Filter).

eg. if current source code:

(defroutes my-app (GET "/*" (html [:h1 "Hello Foo!!"])) ) 

I would like to add a filter as follows:

 (defroutes my-app (GET "/*" (FILTER my-filter-name (html [:h1 "Hello Foo!!"]))) ) 

Where my-filter-name is an arbitrary instance of javax.servlet.Filter.

Any idea how to do this efficiently and elegantly?

+6
clojure servlets servlet-filters openid compojure
source share
1 answer

Ok, now it works for me! Thanks to Cgrand for pointers in the right direction!

My solution was to create a proxy for the filtered servlet and filter chain. The code below is for anyone interested .....

 (def pass-through-filter (proxy [javax.servlet.Filter] [] (doFilter [request response #^javax.servlet.FilterChain filterchain] (do (.doFilter filterchain request response))))) (defn filter-chain [#^javax.servlet.Servlet servlet] (proxy [javax.servlet.FilterChain] [] (doFilter [request response] (.service servlet request response)))) (defn filtered-servlet [#^javax.servlet.Filter servlet-filter handler] (let [#^javax.servlet.Servlet base-servlet (servlet handler) the-filter-chain (filter-chain base-servlet)] (proxy [javax.servlet.http.HttpServlet] [] (service [request response] (.doFilter servlet-filter request response the-filter-chain)) (init [config] (.init base-servlet config))))) (defroutes my-app (GET "/*" (html [:h1 "Hello Foo!!"])) (ANY "*" [404 "Page not found"])) (run-server {:port 80} "/*" (filtered-servlet pass-through-filter my-app)) 
+8
source share

All Articles