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で以前に使用したようなフィルターを指定できる理由を知っておくとよいでしょう。