对Compojure使用javax.servlet.Filter [英] Using a javax.servlet.Filter with Compojure

查看:201
本文介绍了对Compojure使用javax.servlet.Filter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用Clojure / Compojure构建一个简单的网站,并希望将servlet过滤器应用于请求/响应(即标准的javax.servlet.Filter实例)。



例如如果当前源代码是:

 (defroutes my-app 
(GET/ *
(html [:h1Hello Foo !!))



喜欢添加一个过滤器,像这样:

 (defroutes my-app 
(GET/ *
(FILTER my-filter-name
(html [:h1Hello Foo !!)))


其中my-filter-name是javax.servlet.Filter的某个任意实例。



任何想法如何有效地和优雅?

解决方案

确定我现在已经工作了!感谢cgrand在正确的方向上的指针!



我的解决方案涉及为过滤的servlet和过滤器链创建代理。

 (def pass-through-filter 
(proxy [javax。 servlet.Filter] []
(doFilter
[请求响应#^ javax.servlet.FilterChain filterchain]
(do
(.doFilter filterchain请求响应)))))


(defn filter-chain
[#^ javax.servlet.Servlet servlet]
(proxy [javax.servlet.FilterChain] []
doFilter
[请求响应]
(.service servlet请求响应)))

(defn filtered-servlet
[#^ javax.servlet.Filter servlet-过滤器处理程序]
(let [#^ javax.servlet.Servlet base-servlet(servlet handler)
the-filter-chain(filter-chain base-servlet)]
.servlet.http.HttpServlet] []
(service
[request response]
(.doFilter servlet-filter请求响应过滤器链))
(init
[config]
(.init base-servlet config))))

(defroutes my-app
(GET/ *

[:h1Hello Foo !!))
(任何*
[404页面未找到])

$ b b
(run-server {:port 80}
/ *(filtered-servlet pass-through-filter my-app))


I'm trying to build a simple web site using Clojure / Compojure and want to feed apply a servlet filter to the request / response (i.e. a standard javax.servlet.Filter instance).

e.g. if the current source code is:

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

I would like to add a filter like this:

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

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

Any idea how to do this effectively and elegantly?

解决方案

Ok I've now got this working! Thanks cgrand for the pointers in the right direction!

My solution involved creating proxies for a filtered servlet and a filter chain. Code below 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))

这篇关于对Compojure使用javax.servlet.Filter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆