首页 文章

如何配置嵌入式Jetty(v9)以设置特定资源文件的特定标头?

提问于
浏览
2

是否可以配置嵌入式Jetty(v9)以仅为特定资源文件类型设置特定标头 .

目前,我没有做任何特殊的事情来处理静态资源,所以可能Jetty有一些默认的处理程序设置来做到这一点 . 是否可以使用某些自定义设置扩展或重载该默认处理程序,以便我只能为 html 文件设置 Cache-Control 标头?

我正在尝试完成类似于下面的Apache配置的东西:

<Files "*.html">
  Header set Cache-Control "public, max-age=900"
</Files>

...在我的Jetty设置中:

public static void main(String[] args) throws Exception {
    Server server = new Server(443);
    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar("war");
    server.setHandler(webapp);
    ...
    ...
}

实际上,如果这可以在jetty.xml或其他配置文件中完成,那将是更可取的 .

2 回答

  • 2

    我能够在jetty-env.xml中为我的webapp使用此配置完成我想要的任务:

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">
    
        <Call name="insertHandler">
          <Arg>
            <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
            <Set name="rewriteRequestURI"><Property name="jetty.rewrite.rewriteRequestURI" deprecated="rewrite.rewriteRequestURI" default="true"/></Set>
            <Set name="rewritePathInfo"><Property name="jetty.rewrite.rewritePathInfo" deprecated="rewrite.rewritePathInfo" default="false"/></Set>
            <Set name="originalPathAttribute"><Property name="jetty.rewrite.originalPathAttribute" deprecated="rewrite.originalPathAttribute" default="requestedPath"/></Set>
    
            <Call name="addRule">
              <Arg>
                <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                  <Set name="pattern">*.html</Set>
                  <Set name="name">Cache-Control</Set>
                  <Set name="value">Max-Age=900,public</Set>
                  <Set name="terminating">true</Set>
                </New>
              </Arg>
            </Call>
    
          </New>
        </Arg>
      </Call>
    
    </Configure>
    
  • 1

    你的解决方案帮助我以完全嵌入的方式实现了这一点 .

    我正在使用jetty 9.2.19 org.eclipse.jetty.rewrite.handler.RewriteHandler . 我将ResourceHandler包装在此RewriteHandler中以设置特定的http标头(此处为Cache-Control):

    RewriteHandler rewriteHandler = new RewriteHandler();
    rewriteHandler.addRule(new Rule()
      {
      @Override
      public String matchAndApply(String target, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException
        {
        // you can check the target for its path or filetype or whatever
        if((target.endsWith(".woff2")) || ... || (target.endsWith(".jpg")))
          {
          httpServletResponse.setHeader("Cache-Control", "public, max-age=2592000");
          }
        return null;
        }
      });
    // set the RewriteHandler around the ResourceHandler
    rewriteHandler.setHandler(resource_handler);
    // set the RewriteHandler to the Webservers Handlerlist...
    

相关问题