2014-09-23 108 views
4

我试图在Jetty 9上启用gzip压缩。我不想在我的web.xml中配置它,所以基于Jetty文档我已经配置了一个override-web。 XML。我没有在嵌入模式下使用Jetty,而是作为容器。如何为Jetty 9启用GZIP

在我的{jetty.home}/webapps文件夹中,我有我的战争文件 - cc.war。我还定义了一个cc.xml如下

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> 

<!-- ================================================================== 
Configure and deploy the test web application in $(jetty.home)/webapps/test 

Note. If this file did not exist or used a context path other that /test 
then the default configuration of jetty.xml would discover the test 
webapplication with a WebAppDeployer. By specifying a context in this 
directory, additional configuration may be specified and hot deployments 
detected. 
===================================================================== --> 

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 

    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
    <!-- Required minimal context configuration :      --> 
    <!-- + contextPath             --> 
    <!-- + war OR resourceBase           --> 
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
    <Set name="contextPath">/</Set> 
    <Set name="war"><Property name="jetty.webapps"/>/cc.war</Set> 

    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
    <!-- Optional context configuration         --> 
    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> 
<!-- <Set name="extractWAR">true</Set> 
    <Set name="copyWebDir">false</Set> 
--> 
    <!--<Set name="defaultsDescriptor"><Property name="jetty.home" default="."/>/etc/webdefault.xml</Set>--> 
    <Set name="overrideDescriptor"><Property name="jetty.webapps" default="."/>/cc.d/override-web.xml</Set> 
</Configure> 

在文件夹cc.d,我已经覆盖-web.xml中,如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5"> 

    <filter> 
     <filter-name>GzipFilter</filter-name> 
     <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class> 
     <init-param> 
      <param-name>methods</param-name> 
      <param-value>GET,POST</param-value> 
     </init-param> 
     <init-param> 
      <param-name>mimeTypes</param-name> 
      <param-value>text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/x-javascript,application/javascript,application/json,application/xml,application/xml+xhtml,image/svg+xml</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>GzipFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

码头似乎加载这个很好,但gzip压缩不适用于任何响应。我说Jetty加载了这个罚款,因为之前当我试图将override-web.xml放入webapps文件夹时,Jetty正在抱怨。

我已经通过了这里的各种问题,但没有一个人似乎有这个答案。 任何帮助表示赞赏。

+0

你想在码头一个Servlet 2.5体验9? (只是问,因为你的override-web.xml声明了2.5,而且我们不知道你的cc.war声明为什么) – 2014-09-23 19:05:52

+0

我的cc.war中的web.xml声明了version = 2.5。 – IceMan 2014-09-23 20:17:58

回答

2

我认为你应该可以在webdefault.xml中配置通用过滤器。尝试在那里注册Gzip过滤器。

+0

只有在上下文xml deployable中引用webdefault.xml时才会使用它。它在所有部署故意不使用默认情况下。请参阅[test-jetty-webapp示例](https://github.com/eclipse/jetty.project/blob/jetty-9.2.3.v20140905/tests/test-webapps/test-jetty-webapp/src/main/ config/demo-base/webapps/test.xml#L29) – 2014-09-23 22:00:20

+0

你是对的。但是在不触及战争的情况下放置过滤器仍然是一个方便的地方,对吧? – kaqqao 2014-09-23 22:04:00

+0

如果您将webdefault.xml复制到您自己的副本并对其进行修改,那么修改原生webdefault.xml并不是很有前途,并且不会使用$ {jetty.base} vs $ { jetty.home}功能非常好。 – 2014-09-23 22:15:59

2

一个保持GZIP配置您的应用程序在一个码头容器中运行(非嵌入式),而方法是将过滤器添加到您的上下文XML:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath"><!-- set context path --></Set> 
    <Set name="war"><!-- set war path --></Set> 

    <Call name="addFilter"> 
     <Arg>org.eclipse.jetty.servlets.GzipFilter</Arg> 
     <Arg>/*</Arg> 
     <Arg> 
      <Call name="of" class="java.util.EnumSet"> 
       <Arg><Get name="REQUEST" class="javax.servlet.DispatcherType" /></Arg> 
      </Call> 
     </Arg> 
     <Call name="setInitParameter"> 
      <Arg>mimetypes</Arg> 
      <Arg>text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/x-javascript,application/javascript,application/json,application/xml,application/xml+xhtml,image/svg+xml</Arg> 
     </Call> 
     <Call name="setInitParameter"> 
      <Arg>methods</Arg> 
      <Arg>GET,POST</Arg> 
     </Call> 
    </Call> 
</Configure> 
+0

你也可以用'jetty-env.xml'做一个类似的事情(虽然它可能不是架构理想的地方):'(对于Jetty 8.1;包名可能已在Jetty 9中更改) – 2017-10-14 16:40:53