2016-09-19 10 views
0

ContainerResponseFilterを使用してDropwizard 1.0.0アプリケーションがあります。一連のヘッダが各リソースに適用されることが予想されますが、ルートレベルのドキュメントにのみ適用されます。Jersey ContainerResponseFilterがすべての応答に適用されていません

Filterクラス:

package com.uk.jacob.filters; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.core.MultivaluedMap; 
import java.io.IOException; 

public class SecurityFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException { 
     MultivaluedMap<String, Object> headers = containerResponseContext.getHeaders(); 

     headers.add("strict-transport-security", "max-age=31536000"); 
     headers.add("x-content-type-options", "nosniff"); 
     headers.add("x-frame-options", "SAMEORIGIN"); 
     headers.add("x-xss-protection", "1; mode=block"); 
    } 
} 

Applicationクラス:

package com.uk.jacob; 

import com.uk.jacob.filters.SecurityFilter; 
import com.uk.jacob.resources.HomepageResource; 
import io.dropwizard.Application; 
import io.dropwizard.assets.AssetsBundle; 
import io.dropwizard.client.HttpClientBuilder; 
import io.dropwizard.setup.Bootstrap; 
import io.dropwizard.setup.Environment; 
import io.dropwizard.views.ViewBundle; 
import org.apache.http.client.HttpClient; 

public class websiteApplication extends Application<websiteConfiguration> { 

    public static void main(final String[] args) throws Exception { 
     new websiteApplication().run(args); 
    } 

    @Override 
    public String getName() { 
     return "website"; 
    } 

    @Override 
    public void initialize(final Bootstrap<websiteConfiguration> bootstrap) { 
     bootstrap.addBundle(new ViewBundle<websiteConfiguration>()); 
     bootstrap.addBundle(new AssetsBundle("/public/", "/public")); 
    } 

    @Override 
    public void run(final websiteConfiguration configuration, final Environment environment) { 
     final HttpClient httpClient = new HttpClientBuilder(environment).using(configuration.getHttpClientConfiguration()).build(getName()); 

     environment.jersey().register(new SecurityFilter()); 
     environment.jersey().register(new HomepageResource(httpClient)); 
    } 

} 
+0

ルートレベルのドキュメントとは何ですか?ヘッダーが追加されていないときにヘッダーが追加されたときの例と、表示されることを期待する例を追加してください。あなたが提供した情報から、これはちょうどうまくいくはずです。 – pandaadb

+0

私は1つのビューとリソースを持つ私のボックスでクイックテストを実行し、フィルターが正しく適用されています。 – pandaadb

+0

/index.htmlは役に立ちます /image.pngしませんでした。潜在的にこれはAssetsBundleに関連していますか? –

答えて

0

あなたの問題はAssetBundleです。 AssetBundleは別々のサーブレットであり、ジャージーのエコシステムを経由しません。ソースから:

@Override 
public void run(Environment environment) { 
    LOGGER.info("Registering AssetBundle with name: {} for path {}", assetsName, uriPath + '*'); 
    environment.servlets().addServlet(assetsName, createServlet()).addMapping(uriPath + '*'); 
} 

これは、アセットリソースでフィルタが呼び出されない理由です。これを解決するには、資産リクエストをフィルタリングしてヘッダーを追加するServletFilter(旧式のスタイル)を追加する必要があります。また、あなたが通常のサーブレットフィルタを使用して、DWに登録する必要があり、あなたの資産の束にあなたのヘッダを追加するために

ここでは私ServletFilterのコードです:

public class ServletRequestFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     System.out.println("Asset filter"); 

     HttpServletResponse httpServletResponse = ((HttpServletResponse) response); 
     httpServletResponse.addHeader("ARTUR", "test"); 

     chain.doFilter(request, httpServletResponse); 
    } 

    @Override 
    public void destroy() { 
    } 

} 

これは、その後で次のように登録します。

public class ViewApplication extends io.dropwizard.Application<Configuration>{ 

    @Override 
    public void run(Configuration configuration, Environment environment) throws Exception { 
     environment.jersey().register(ViewResource.class); 
     environment.jersey().register(HeaderResponseFilter.class); 
     environment.servlets().addFilter("Custom-Filter-Name", new ServletRequestFilter()).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/assets/*"); 
    } 

    @Override 
    public void initialize(Bootstrap<Configuration> bootstrap) { 
     super.initialize(bootstrap); 
     bootstrap.addBundle(new ViewBundle<>()); 
     bootstrap.addBundle(new AssetsBundle("/assets/", "/assets")); 
    } 

    public static void main(String[] args) throws Exception { 
     new ViewApplication().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml"); 
    } 

} 

注:私は/assets/内のURLの資産バンドルを登録しています。これは、フィルタの登録(アセットリソースのみをフィルタリングする)にも記載されています。あるいは、あなたはそれをすべての呼び出しで照合し、それを通してすべてをフィルターに掛けることができます(そうすれば、私が信じているジャージーの相手を取り除くことができます)。

最後に私のリソースのためのテスト:

[email protected]:~/dev/repo/sandbox$ curl -v "http://localhost:9085/assets/test.txt" 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 9085 (#0) 
> GET /assets/test.txt HTTP/1.1 
> Host: localhost:9085 
> User-Agent: curl/7.47.0 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Date: Mon, 19 Sep 2016 15:07:13 GMT 
< ARTUR: test 
< Last-Modified: Mon, 19 Sep 2016 14:52:37 GMT 
< ETag: "0d1ae97d61a8900c99abddb8741febaf" 
< Content-Type: text/plain;charset=utf-8 
< Vary: Accept-Encoding 
< Content-Length: 11 
< 
asd 
asd 
* Connection #0 to host localhost left intact 

注意私のカスタムヘッダーARTUR: test

よろしく、

アルトゥル

関連する問題