1

AbstractAnnotationConfigDispatcherServletInitializer から拡張されたクラスを使用する純粋な JavaConfig Java webapp があります。ディスパッチャ サーブレットの構成には最適ですが、ディスパッチャ サーブレットは URL パターン「/rest/*」のリクエストにのみマップされます。他のすべてのリクエスト (つまり、css、html、js など) の場合、Spring マッピングはなく、すべてがデフォルトのサーブレットを通過します。これらのリクエストに対して、GZip フィルターを実装したいと考えています。私は何年も前にオンラインで見つけたカスタム gzip フィルターを多くのプロジェクトで使用しました。

JavaConfig 実装では、保護された Filter[] getServletFilters() メソッドがディスパッチャ サーベットに適用されることを理解しています...これは正しくありませんか?

私が今やろうとしているのは、gzip フィルターを、ディスパッチャー サーブレットに送信されないすべての要求に適用することです。次のように onStartup メソッドをオーバーライドしています。

@Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);      
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding", "UTF-8");
        encodingFilter.setInitParameter("forceEncoding", "true");
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");

        FilterRegistration.Dynamic gzipFilter = servletContext.addFilter("gzipFilter", new GzipFilter());
        gzipFilter.addMappingForUrlPatterns(null, true, "/*");   
    }

エンコーディング フィルタは正常に動作しますが、マッピングを追加すると GzipFilter で NullPointerException が発生します... servletContext.addFilter は null を返します。カスタム クラスと新しい JavaConfig の実装に何かおかしな点があるのではないかと考えたので、人々が ehacache-web パッケージに含まれる gzip フィルターを使用していることをオンラインで見つけたので、それを依存関係として追加し、代わりにそのフィルターを使用しようとしました。 . 同じこと... CharacterEncodingFilter は正常に機能し、addFilter メソッドは適切に FilterRegistration.Dynamic オブジェクトを返しますが、gzip フィルターは引き続き null を返します。

これを引き起こしているアイデアはありますか?

編集:

ここに私の設定ファイル全体があります:

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);

        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        encodingFilter.setInitParameter("encoding", "UTF-8");
        encodingFilter.setInitParameter("forceEncoding", "true");
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");

        FilterRegistration.Dynamic gzipFilter = servletContext.addFilter("gzipFilter", new GzipFilter());
        gzipFilter.addMappingForUrlPatterns(null, true, "/*");


    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SecurityConfig.class, Log4jConfig.class, PersistenceConfig.class, ServiceConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{
            "/rest/*",
            "/index.html",
            "/login.html",
            "/admin.html",
            "/index/*",
            "/login/*",
            "/admin/*"
        };
    }

    @Override
    protected Filter[] getServletFilters() {
        OpenEntityManagerInViewFilter openEntityManagerInViewFilter = new OpenEntityManagerInViewFilter();
        openEntityManagerInViewFilter.setBeanName("openEntityManagerInViewFilter");
        openEntityManagerInViewFilter.setPersistenceUnitName("HSQL");

        return new javax.servlet.Filter[]{openEntityManagerInViewFilter};
    }

}

GzipFilter を getServletFilters() に追加するか、「/*」の URL マッピングを使用して servletContext.addFilter() から FilterRegistration.Dynamic を作成するかに関係なく、ディスパッチャー サーブレットを介して処理されるリクエストのみが gzip されます。

編集2:

gzip されていない URL は次のとおりです。

http://localhost:8084/swtc/js/ServiceWidget/templates/ServiceWidget.html

Response Headers
Accept-Ranges   bytes
Content-Length  399
Content-Type    text/html
Date    Mon, 07 Apr 2014 18:47:08 GMT
Etag    W/"399-1377195848751"
Last-Modified   Thu, 22 Aug 2013 18:24:08 GMT
Server  Apache-Coyote/1.1

gzip されている URL は次のとおりです。

http://localhost:8084/swtc/rest/mapServices/getEnabledServices

Response Headers
Content-Encoding    gzip
Content-Length  76
Content-Type    application/json;charset=UTF-8
Date    Tue, 08 Apr 2014 18:34:11 GMT
Server  Apache-Coyote/1.1

Dispatcher servet マッピングを /* に変更し、js、css、img などのフォルダーをリソースとして定義するオプションはありますか? 私はこれが問題を回避しているように感じます.Springとは関係のないweb.xmlで以前に使用したようなフィルターを指定できる理由を知っておくとよいでしょう。

4

1 に答える 1

2

あなたは私が望むほど私たちに与えてくれませんでしたが、Javadoc にServletContext#addFilter(String, Filter)は次のように書かれています

戻り値:FilterRegistration指定されたフィルタをさらに構成するために使用できるオブジェクト、またはこの ServletContextに指定されたフィルタ nullの完了がすでに含まれている場合、または同じフィルタ インスタンスが同じコンテナ内のこのまたは別の ServletContext にすでに登録されている場合FilterRegistrationfilterName

あなたはFilterすでに同じ名前でそれまたは別のものを登録しているようです。

于 2014-04-07T22:09:17.233 に答える