Spring中的自定义过滤器

时间:2012-02-06 13:51:00

标签: spring spring-mvc filter

我编写了自己的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没有经验),因为如果我在web.xml文件中指定org.springframework.web.filter.CharacterEncodingFilter而不是my.local.package.filter.CharacterEncodingFilter,那么它可以完美地运行。

有人可以帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:7)

您正在拨打filterChain.doFilter(request, response);两次。一旦进入您的代码,一次进入super.doFilterInternal(request, response, filterChain);

要解决此问题,只需将doFilter条款中的else放入if