如何在Jetty中以编程方式设置gzip?

时间:2012-04-13 17:59:10

标签: clojure jetty embedded-jetty

我正在使用Noir和clojure编写一个Web应用程序,它使用Jetty。 Jetty有两种使用gzip的方法,一种用于静态,一种用于动态,它们在https://stackoverflow.com/a/9113129/104021中描述。我想打开静态和动态gzipping,但我们的项目不使用web.xml文件,也不想启动。

如何以编程方式设置jetty以使用gzip(即没有web.xml)?

2 个答案:

答案 0 :(得分:4)

在我正在开发的Compojure应用程序中,我有一个基于ring-jetty-adapter的Ring / Jetty适配器,它以编程方式配置Jetty以动态地使用GzipHandler gzip内容。

(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处理程序,并使用一些处理程序进行设置。请注意GzipHandlerHandlerWrapper,因此需要我的(代理)Ring处理程序和委托给它。我还添加了一个日志处理程序,它将在(gzip-wrapped)Ring处理程序之后执行。

查看complete working version

答案 1 :(得分:1)

请参阅此处的startServer方法:

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/GzipWithPipeliningTest.java

jetty广泛用于测试,所以大多数嵌入式场景都需要人们在单元测试中存在,当然找到它们可能有点问题:)