Servlets – use javax with compojure servlet. Filter
•
Java
I'm trying to build a simple web site using clojure / compojure and want to apply servlet filters to requests / responses (i.e. standard javax. Servlet. Filter instances)
For example, if the current source code is:
(defroutes my-app (GET "/*" (html [:h1 "Hello Foo!!"])) )
I want to add a filter like this:
(defroutes my-app (GET "/*" (FILTER my-filter-name (html [:h1 "Hello Foo!!"]))) )
Where my filter name is javax servlet. Any instance of filter
Know how to do this effectively and gracefully?
Solution
OK, I have this job now! Thank cgrand for pointing in the right direction!
My solution involves creating proxies for filtered servlets and filter chains The following code 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))
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码