欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Zuul Filter过滤器返回信息提示getWriter() has already been called for this response

程序员文章站 2022-05-19 11:22:34
文章目录一、问题说明二、问题原因三、问题解决一、问题说明在使用zuul filter过滤器检验token是有效,当无效时返回错误提示测试时出现错误访问服务时一直提示下面的错误java.lang.IllegalStateException: getWriter() has already been called for this response二、问题原因根据提示是getWriter()方法已经被调用过了,所以猜测是返回数据时当前的response已经响应了,但是需要返回的数据还在缓...


一、问题说明

  1. 在使用zuul filter过滤器检验token是有效,当无效时返回错误提示测试时出现错误
  2. 出现问题代码如下
@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;
}
  1. 访问服务时一直提示下面的错误
java.lang.IllegalStateException: getWriter() has already been called for this response

Zuul Filter过滤器返回信息提示getWriter() has already been called for this response

二、问题原因

  1. 根据提示是getWriter()方法已经被调用过了,所以猜测是返回数据时当前的response已经响应了,但是需要返回的数据还在缓冲区中没有真实返回
  2. 所以可能需要在返回数据前将缓冲区数据刷新,根据这个成功解决

三、问题解决

  • 根据上述分析,在返回前就将缓冲区全部数据刷新即可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;
 }
  1. 然后重新启动再次访问数据成功返回
    Zuul Filter过滤器返回信息提示getWriter() has already been called for this response

本文地址:https://blog.csdn.net/sinat_34104446/article/details/110206842