복붙노트

[SPRING] Tuckey UrlRewrite Filter가 규칙이 일치 한 후 chain.doFilter를 호출하지 않는 이유는 무엇입니까?

SPRING

Tuckey UrlRewrite Filter가 규칙이 일치 한 후 chain.doFilter를 호출하지 않는 이유는 무엇입니까?

여기에 Spring Framework 사용하기 ...

나는 css 파일의 응답 본문을 변경하는 필터를 만들었고 URL을 직접 호출하면이 필터가 실행됩니다. 그러나 urlrewrite 규칙이 일치하면 필터는 건너 뜁니다.

예: 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>

(우리는 여러 가지 이유로 이것을 필요로한다)

따라서 경로가 "/ styles-special /"로 시작하는 모든 * .css 파일은 "/ styles /"로 다시 작성되고 cssFilter는 호출되지 않지만 경로가 w / "/ styles /"로 시작하는 모든 * .css 파일은 " styles / "는 예상대로 cssFilter를 통해 실행됩니다.

나는 cssFilter에 대한 url-pattern을 다양한 옵션으로 변경하려고 시도했지만 동일한 결과를 보였다. 그것은 저에게 tuckey urlrewrite 필터가 chain.doFilter ()를 다시 작성한 후에 호출하지 않는 것 같지만 그보다 복잡 할 수도 있습니다.

어떤 이슈가 여기에 있을지 모릅니다. 예상되는 기능입니까? 해결 방법은 무엇입니까? 어쩌면 요격기 나 관제사가 여기 갈 수있는 방법일까요?

이것에 대한 조언을 미리 감사드립니다 !!

참고 : 다음을 사용하십시오 (axtavt가 제안한대로).

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

체인이있는 문제를 수정하고 필터가 실행됩니다. 그러나 다음과 같은 오류가 발생합니다.

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)

다음은 Filter의 코드 스 니펫입니다.

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
...

해결법

  1. ==============================

    1.Tuckey UrlRewrite Filter가 URL을 다시 쓰면 필터 체인을 통과하지 않고 새 URL로 요청을 전달합니다. 기본적으로 필터는 전달 된 요청에 적용되지 않으므로 구성해야합니다.

    Tuckey UrlRewrite Filter가 URL을 다시 쓰면 필터 체인을 통과하지 않고 새 URL로 요청을 전달합니다. 기본적으로 필터는 전달 된 요청에 적용되지 않으므로 구성해야합니다.

    <filter-mapping>
         <filter-name>cssFilter</filter-name>
         <url-pattern>*css</url-pattern>
         <dispatcher>REQUEST</dispatcher>
         <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    
  2. from https://stackoverflow.com/questions/5043593/why-doesnt-tuckey-urlrewrite-filter-call-chain-dofilter-after-a-rule-is-matched by cc-by-sa and MIT license