ルールが一致した後に、Tuckey URLRewriteフィルタChoin.DofilterはなぜurlRewriteフィルタを呼び出さないのですか?

StackOverflow https://stackoverflow.com/questions/5043593

質問

Spring Frameworkをここに使用しています...

私はCSSファイルの応答本体を変更するためのフィルタを作成し、それが実行されるURLを呼び出すならば。ただし、URLReRwriteルールが一致した場合、フィルタはスキップされます。

例: web.xml:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <!-- skipping init params here for brevity -->
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>cssFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
    <filter-mapping>
    <filter-name>cssFilter</filter-name>
    <url-pattern>*css</url-pattern>
</filter-mapping>
.

urlrewrite.xml:でこのようにマッピング設定されています。

<rule>
    <from>/styles-special/(.*)$</from>
    <to last="true">/styles/$1</to>
</rule>
.

(私たちは理由がいくつかあります)

SO、パスがw / "/ styles-special /"が起動し始める任意の* .cssファイルは "/ styles /"に書き換えられ、cssfilterは呼び出されませんが、パスがWを起動した* .cssファイルはいずれにも書き換えられません。 / "/ styles /"は予想どおりCSSFilterを介して実行されます。

CSSFilterのURLパターンをさまざまなオプションに変更しようとしましたが、同じ結果になりました。 Tuckey URLRewriteフィルタが書き換え後にchain.dofilter()を呼び出さないのが私のようですが、それはそれよりも複雑であるかもしれません。

問題がここにいるかもしれないものは何ですか?この予想される機能はありますか?回避策は? ...おそらくインターセプターやコントローラーはここに行く方法ですか?

これについてのアドバイスをお待ちしています!


注:次の(axtavtによって示唆されているように)を使う:

<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
.

問題W / Chainingを修正し、フィルタが実行されます。ただし、次のエラーが発生します。

java.lang.IllegalStateException: NO CONTENT
at org.mortbay.jetty.HttpGenerator.addContent(HttpGenerator.java:106)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579)
.

ここにフィルタからのコードスニペット:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    OutputStream out = httpResponse.getOutputStream();
    GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse);

    chain.doFilter(request, wrapper);

    if(log.isDebugEnabled()) log.debug("doFilter: chain");

    String respBody = new String(wrapper.getData()); // this throws error
...
.

役に立ちましたか?

解決

When Tuckey UrlRewrite Filter rewrites a URL, it forwards request to the new URL instead of passing it down the filter chain. By default filters are not applied to the forwarded requests, so you need to configure it:

<filter-mapping>
     <filter-name>cssFilter</filter-name>
     <url-pattern>*css</url-pattern>
     <dispatcher>REQUEST</dispatcher>
     <dispatcher>FORWARD</dispatcher>
</filter-mapping>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top