Pergunta

Usando Spring Framework aqui ...

Criei um filtro para alterar o corpo da resposta dos arquivos css e se eu chamar uma url diretamente ela é executada.No entanto, se uma regra urlrewrite corresponder, o filtro será ignorado.

Exemplo:Em 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>

Existe um mapeamento configurado como este em urlrewrite.xml:

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

(precisamos disso por vários motivos)

então, qualquer arquivo *.css cujo caminho comece com "/styles-special/" será reescrito para "/styles/" e o cssFilter não será chamado, mas qualquer arquivo *.css cujo caminho comece com "/ estilos/" será executado no cssFilter conforme esperado.

Tentei alterar o padrão de URL do cssFilter para várias opções diferentes, mas o mesmo resultado.Parece-me que o filtro tuckey urlrewrite simplesmente não chama chain.doFilter() após uma reescrita, mas talvez seja mais complicado do que isso?

Alguma ideia de qual pode ser o problema aqui?Essa funcionalidade é esperada?Alguma solução alternativa?...talvez um interceptador ou controlador seja a melhor opção aqui?

Agradecemos antecipadamente por qualquer conselho sobre isso!!


Observação:Usando o seguinte (conforme sugerido por axtavt):

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

Corrige o problema com encadeamento e o filtro é executado.No entanto, recebo o seguinte erro:

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)

Aqui está o trecho de código do 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
...
Foi útil?

Solução

Quando o Tuckey UrlRewrite Filter reescreve um URL, ele encaminha a solicitação para o novo URL em vez de passá-la pela cadeia de filtros.Por padrão, os filtros não são aplicados às solicitações encaminhadas, então você precisa configurá-lo:

<filter-mapping>
     <filter-name>cssFilter</filter-name>
     <url-pattern>*css</url-pattern>
     <dispatcher>REQUEST</dispatcher>
     <dispatcher>FORWARD</dispatcher>
</filter-mapping>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top