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

我就是我 2022-12-24 05:49 237阅读 0赞

文章目录

  • 一、问题说明
  • 二、问题原因
  • 三、问题解决

一、问题说明

  1. 在使用zuul filter过滤器检验token是有效,当无效时返回错误提示测试时出现错误
  2. 出现问题代码如下

    @Override
    public Object run() throws ZuulException {

    1. RequestContext ctx = RequestContext.getCurrentContext();
    2. String token = ctx.getRequest().getParameter("token");
    3. log.info("获取到token信息:{}", token);
    4. if (Objects.isNull(token)) {
    5. ctx.setSendZuulResponse(false);
    6. Map<String, Object> resp = new HashMap<>(4);
    7. resp.put("success", false);
    8. resp.put("errMsg", "token不能为空");
    9. ctx.setResponseBody(JSONObject.toJSONString(resp));
    10. ctx.getResponse().setContentType("application/json; charset=utf-8");
    11. return null;
    12. }
    13. return null;

    }

  3. 访问服务时一直提示下面的错误

    java.lang.IllegalStateException: getWriter() has already been called for this response

在这里插入图片描述

二、问题原因

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

三、问题解决

  • 根据上述分析,在返回前就将缓冲区全部数据刷新即可ctx.getResponse().flushBuffer();

    @Override
    public Object run() throws ZuulException {

    1. RequestContext ctx = RequestContext.getCurrentContext();
    2. String token = ctx.getRequest().getParameter("token");
    3. log.info("获取到token信息:{}", token);
    4. if (Objects.isNull(token)) {
    5. ctx.setSendZuulResponse(false);
    6. Map<String, Object> resp = new HashMap<>(4);
    7. resp.put("success", false);
    8. resp.put("errMsg", "token不能为空");
    9. ctx.setResponseBody(JSONObject.toJSONString(resp));
    10. ctx.getResponse().setContentType("application/json; charset=utf-8");
    11. try {
    12. // 调用flushBuffer刷新缓冲区数据即可
    13. ctx.getResponse().flushBuffer();
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. }
    17. return null;
    18. }
    19. return null;

    }

  1. 然后重新启动再次访问数据成功返回
    在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,237人围观)

还没有评论,来说两句吧...

相关阅读