SpringBoot 的 Filter 不慎操作会导致请求结果有两次返回
问题描述
如题,有时候,我们会遇到使用 Postman 测试在 Spring Boot 的后端 request 一次但是 response 有两次(或者多次)返回结果的情况(即返回的 response 里有两个 json 体)。一种可能导致这种情况的原因便是 Filter 编写的问题。
原因解释
package servletbean;
public class encodefilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(request.getCharacterEncoding()==null) {
System.out.println(encoding);
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);//到下一个链
}
public void init(FilterConfig fConfig) throws ServletException {
this.config=fConfig;
encoding=fConfig.getInitParameter("encoding");//获得目标编码格式
}
}
上面是一个 Filter 的例子,我们需要注意到的一个点是 chain.doFilter
会将请求转发给过滤器链下一个 Filter,并且这个方法并不会return
,所以 doFilter
之后,后续的代码依旧会执行。
如果在 doFilter
后并没有 return
,而且你的 Filter 里恰好存在多个 do.Filter
,就会导致请求的结果返回多个 json 体。
所以,请务必确保 doFilter
后一定要 return
。
chain.doFilter(request, response);//到下一个链
return;