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

时间:2016-03-31 16:54:48

标签: java jetty embedded-jetty

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

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

我试图完成类似于以下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 个答案:

答案 0 :(得分: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 :(得分: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...