2014-02-16 106 views
4

我有一個運行嵌入式jetty服務器的項目。 另外,我有項目的依賴項中的angularjs-1.2.12.jar。如何配置嵌入式jetty + webjars

如何配置jetty以暴露META-INF /資源中的文件。 我試着做到以下幾點:從目標/班

ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[]{ "index.html" }); 
    resource_handler.setBaseResource(Resource.newClassPathResource("/")); 

    Server server = new Server(8080); 
    server.setHandler(resource_handler); 

但只有文件被曝光。

謝謝。

UPD:解決

ResourceHandler resource_handler = new ResourceHandler() { 
     @Override 
     public Resource getResource(String path) 
       throws MalformedURLException { 
      Resource resource = Resource.newClassPathResource(path); 
      if (resource == null || !resource.exists()) { 
       resource = Resource.newClassPathResource("META-INF/resources" + path); 
      } 
      return resource; 
     } 
    }; 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler.setResourceBase("/"); 
    server.setHandler(resource_handler); 
+0

你使用什麼版本的Jetty? –

+0

jetty-all-9.1.1 –

+3

它看起來像解決方案可能會暴露類路徑上的所有資源作爲靜態資產。如果這樣可能是一個很大的安全漏洞。這就是爲什麼Servlet 3的默認設置只能爲'META-INF/resources'前綴路徑執行此操作。 –

回答

0

我知道這是一個老問題,但我有同樣的問題,並在尋找一切後,你的解決方案是最好的。但正如James Ward在評論中指出的那樣,這構成了一個安全問題。這裏是我的解決方案,建立在你的:

public class MyResourceHandler extends ResourceHandler { 
    @Override 
    public Resource getResource(String path) { 
     Resource resource = Resource.newClassPathResource("META-INF/resources" + path); 
     if(resource == null) resource = super.getResource(path); 
     return resource; 
    } 
} 

正如指出hereResourceHandler有點過時。我實際上通過擴展DefaultServlet來實現此解決方案。

相關問題