gpt4 book ai didi

spring - Spring 中的自定义过滤器

转载 作者:行者123 更新时间:2023-12-01 16:08:28 25 4
gpt4 key购买 nike

我编写了自己的 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 :

@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

我认为我以错误的方式对过滤器进行编码(我没有使用过 Spring),因为如果我指定 org.springframework.web.filter.CharacterEncodingFilter 而不是 my. local.package.filter.CharacterEncodingFilter 在 web.xml 文件中,它完美地工作。

有人可以帮助我吗?

谢谢。

最佳答案

您正在调用 filterChain.doFilter(request, response); 两次。一次在您的代码中,一次在 super.doFilterInternal(request, response, filterChain);

要解决此问题,只需将 doFilter 放在 ifelse 子句中即可。

关于spring - Spring 中的自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com