2012-02-06 3 views
2

Я кодируются свой собственный весенний фильтр для того, чтобы кодировать в UTF-8 все ответы для изображений, кроме:Пользовательские фильтры весной

package my.local.package.filter; 

public class CharacterEncodingFilter extends org.springframework.web.filter.CharacterEncodingFilter 
{ 

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException 
    { 
     if(!request.getRequestURI().endsWith("jpg") && 
       !request.getRequestURI().endsWith("png") && 
       !request.getRequestURI().endsWith("gif") && 
       !request.getRequestURI().endsWith("ico")) 
     { 
      super.doFilterInternal(request, response, filterChain); 
     } 

     filterChain.doFilter(request, response); 
    } 
} 

Я ссылаться на него в web.xml:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>my.local.package.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Все работает так, как ожидалось, файлы jpg/png/gif/ico не кодируются в UTF-8, а все остальные файлы.

Я сейчас пытаюсь закодировать простой контроллер, который должен возвращать ошибку 404 при определенных условиях:

@Controller 
public class Avatar 
{ 
    @RequestMapping("/images/{width}x{height}/{subject}.jpg") 
    public void avatar(HttpServletResponse response, 
         @PathVariable("width") String width, 
         @PathVariable("height") String height, 
         @PathVariable("subject") String subject) throws IOException 
    { 
     ... 

     // if(error) 
     // { 
      response.sendError(HttpServletResponse.SC_NOT_FOUND, "Not found"); 
      return; 
     // } 

     ... 
    } 
} 

Но при запросе, например, /images/52x52/1.jpg я получаю страница, содержащая эту ошибку:

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

Я думаю, что я закодировал фильтр неправильно (я не испытывал с весны), потому что если я указываю org.springframework.web.filter.CharacterEncodingFilter вместо my.local.package.filter.CharacterEncodingFilter в файле web.xml, он отлично работает ,

Может кто-нибудь мне помочь?

спасибо.

ответ

7

Вы звоните filterChain.doFilter(request, response); дважды. После того, как в вашем коде и один раз в super.doFilterInternal(request, response, filterChain);

Чтобы исправить это, просто положить ваш doFilter в предложении else к вашему if.

+0

Большое спасибо, он решил проблему! – satoshi

Смежные вопросы