Springboot thymeleaf 异常:getOutputStream() has already been called for this response 解决

问题产生背景:博主最近加了一个生成验证码的功能,然后配置巴拉巴拉配置好了,发出请求获取验证码。


这个是controller的代码

    @RequestMapping("/vaildCode")
    public void defaultKaptcha() {
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        OutputStream out = null;
        try {
            //生产验证码字符串并保存到session中
            String createText = defaultKaptcha.createText();
            request.getSession().setAttribute("vrifyCode", createText);
            //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
            BufferedImage challenge = defaultKaptcha.createImage(createText);
            ImageIO.write(challenge, "jpg", jpegOutputStream);
            //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
            byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

            response.setHeader("Cache-Control", "no-store");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            out = response.getOutputStream();
            out.write(captchaChallengeAsJpeg);
            out.flush();
        } catch (Exception e) {
            logger.error(e.getMessage());
        } finally {
            try {
                jpegOutputStream.close();
                if (out != null) {
                    out.close();
                }
                System.gc();
            } catch (IOException e) {
                logger.error(e.getMessage());
            }
        }
    }

idea控制台报错了,简单点说就是这一段的报错,其中问题出现在ThymeleafView.java:354

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:624) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
    at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:354) ~[thymeleaf-spring5-3.0.9.RELEASE.jar:3.0.9.RELEASE]

定到源码发现
viewTemplateEngine.process(templateName, processMarkupSelectors, context, response.getWriter());
response.getWriter(),而且网上多数答案都说是因为这里引起的,好吧╮(╯-╰)╭,但是大多数给出的方案是在jsp页面里对response这个做清楚,具体百度啦,可是我用的是thymeleaf啊这可咋办,经过我的百般思考,掉了几根头发以后尝试加了个@ResponseBody代码就变成了这样

    @RequestMapping("/vaildCode")
    @ResponseBody
    public void defaultKaptcha() {
        这一段略了,都是一样的。。。
    }

然后,然后再次发出获取请求。。。然后控制台就不报错了。。。emmm
感觉自己呆呆的。。。

                                                                    此文终!
                                                                    谨以此纪念蠢蠢的自己
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值