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

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

问题描述

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

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!!"])))
)

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

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

知道如何有效和优雅地做到这一点吗?

Any idea how to do this effectively and elegantly?

推荐答案

好的,我现在开始工作了!感谢 cgrand 提供正确方向的指点!

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

我的解决方案涉及为过滤后的 servlet 和过滤器链创建代理.以下代码供任何有兴趣的人使用.....

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天全站免登陆