我正在使用 Noir 和 clojure 编写一个使用 Jetty 的网络应用程序。Jetty 有两种使用 gzip 的方式,一种是静态的,一种是动态的,它们在https://stackoverflow.com/a/9113129/104021中有描述。我想同时打开静态和动态 gzipping,但是我们的项目不使用 web.xml 文件,并且不想启动。
如何以编程方式设置码头以使用 gzip(即没有 web.xml)?
我正在使用 Noir 和 clojure 编写一个使用 Jetty 的网络应用程序。Jetty 有两种使用 gzip 的方式,一种是静态的,一种是动态的,它们在https://stackoverflow.com/a/9113129/104021中有描述。我想同时打开静态和动态 gzipping,但是我们的项目不使用 web.xml 文件,并且不想启动。
如何以编程方式设置码头以使用 gzip(即没有 web.xml)?
在我正在开发的 Compojure 应用程序中,我有一个基于ring-jetty-adapter的 Ring/Jetty 适配器,它以编程方式将 Jetty 配置为使用GzipHandler动态压缩内容。
(defn- configurator [server ring-handler]
(.setHandler server
(doto (new HandlerCollection)
(.addHandler (doto (new GzipHandler)
(.setHandler (proxy-handler ring-handler))
(.setMimeTypes "text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,text/javascript,image/svg+xml")))
(.addHandler (doto (new RequestLogHandler) (.setRequestLog (NCSARequestLog.)))))))
这个函数接受一个Server实例和我的 Ring 处理程序,并使用一些处理程序对其进行设置。请注意,它GzipHandler
是 a HandlerWrapper
,因此它需要我的(代理)环处理程序并委托给它。我还添加了一个日志处理程序,它将在(gzip 包装的)环处理程序之后执行。
查看完整的工作版本。
请参阅此处的 startServer 方法:
jetty 将自身广泛用于测试,因此人们需要的大多数嵌入式场景已经存在于某处的单元测试中,当然找到它们可能有点问题:)