[SPRING] Tuckey UrlRewrite Filter가 규칙이 일치 한 후 chain.doFilter를 호출하지 않는 이유는 무엇입니까?
SPRINGTuckey 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.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>
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
'SPRING' 카테고리의 다른 글
[SPRING] org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 세션이 없습니까? (0) | 2019.03.31 |
---|---|
[SPRING] 여러 데이터베이스 작업에 Spring JdbcTemplate 사용 (0) | 2019.03.31 |
[SPRING] 스프링 보안 - 메소드 보안 주석을 어떻게 사용할 수 있습니까? (0) | 2019.03.31 |
[SPRING] 스프링 부트로 JSON 및 HTML 용 컨트롤러 (0) | 2019.03.31 |
[SPRING] Spring 부트는 web.xml과 같이 <async-supported> 사용 가능 (0) | 2019.03.31 |