Пользовательские фильтры весной - PullRequest
2 голосов
/ 06 февраля 2012

Я кодировал свой собственный фильтр Spring, чтобы кодировать в 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: Невозможно вызвать sendError () после подтверждения ответа

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

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

Спасибо.

1 Ответ

7 голосов
/ 06 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...