Zuul Filter过滤器返回信息提示getWriter() has already been called for this response
文章目录
- 一、问题说明
- 二、问题原因
- 三、问题解决
一、问题说明
- 在使用zuul filter过滤器检验token是有效,当无效时返回错误提示测试时出现错误
出现问题代码如下
@Override
public Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();
String token = ctx.getRequest().getParameter("token");
log.info("获取到token信息:{}", token);
if (Objects.isNull(token)) {
ctx.setSendZuulResponse(false);
Map<String, Object> resp = new HashMap<>(4);
resp.put("success", false);
resp.put("errMsg", "token不能为空");
ctx.setResponseBody(JSONObject.toJSONString(resp));
ctx.getResponse().setContentType("application/json; charset=utf-8");
return null;
}
return null;
}
访问服务时一直提示下面的错误
java.lang.IllegalStateException: getWriter() has already been called for this response
二、问题原因
- 根据提示是getWriter()方法已经被调用过了,所以猜测是返回数据时当前的response已经响应了,但是需要返回的数据还在缓冲区中没有真实返回
- 所以可能需要在返回数据前将缓冲区数据刷新,根据这个成功解决
三、问题解决
根据上述分析,在返回前就将缓冲区全部数据刷新即可
ctx.getResponse().flushBuffer();
@Override
public Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();
String token = ctx.getRequest().getParameter("token");
log.info("获取到token信息:{}", token);
if (Objects.isNull(token)) {
ctx.setSendZuulResponse(false);
Map<String, Object> resp = new HashMap<>(4);
resp.put("success", false);
resp.put("errMsg", "token不能为空");
ctx.setResponseBody(JSONObject.toJSONString(resp));
ctx.getResponse().setContentType("application/json; charset=utf-8");
try {
// 调用flushBuffer刷新缓冲区数据即可
ctx.getResponse().flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
return null;
}
- 然后重新启动再次访问数据成功返回
还没有评论,来说两句吧...