我编写了自己的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
,那么它可以完美地运行。
有人可以帮助我吗?
谢谢。
答案 0 :(得分:7)
您正在拨打filterChain.doFilter(request, response);
两次。一旦进入您的代码,一次进入super.doFilterInternal(request, response, filterChain);
要解决此问题,只需将doFilter
条款中的else
放入if
。