/ / Използване на javax.servlet.Filter с Compojure - сервлети, openid, clojure, servlet-филтри, compojure

Използване на javax.servlet.Filter с Compojure - сървлети, openid, clojure, servlet-filters, compojure

Опитвам се да създам прост уеб сайт, използвайки Clojure / Compojure и искам да храня приложния филтър на сервлетите към заявката / отговора (т.е. стандартен javax.servlet.Filter).

например ако текущият изходен код е:

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

Искам да добавя филтър по следния начин:

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

Където my-filter-name е произволна инстанция на javax.servlet.Filter.

Някаква идея как да направите това ефективно и елегантно?

Отговори:

8 за отговор № 1

Добре, сега имам тази работа! Благодаря cgrand за указателите в правилната посока!

Моето решение включваше създаване на прокси за филтрирана сервлет и филтърна верига. Код по-долу за всеки, който се интересува .....

(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))