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

ゝ一世哀愁。 2022-05-17 11:15 275阅读 0赞

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


这个是controller的代码

  1. @RequestMapping("/vaildCode")
  2. public void defaultKaptcha() {
  3. ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
  4. OutputStream out = null;
  5. try {
  6. //生产验证码字符串并保存到session中
  7. String createText = defaultKaptcha.createText();
  8. request.getSession().setAttribute("vrifyCode", createText);
  9. //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
  10. BufferedImage challenge = defaultKaptcha.createImage(createText);
  11. ImageIO.write(challenge, "jpg", jpegOutputStream);
  12. //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
  13. byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
  14. response.setHeader("Cache-Control", "no-store");
  15. response.setHeader("Pragma", "no-cache");
  16. response.setDateHeader("Expires", 0);
  17. response.setContentType("image/jpeg");
  18. out = response.getOutputStream();
  19. out.write(captchaChallengeAsJpeg);
  20. out.flush();
  21. } catch (Exception e) {
  22. logger.error(e.getMessage());
  23. } finally {
  24. try {
  25. jpegOutputStream.close();
  26. if (out != null) {
  27. out.close();
  28. }
  29. System.gc();
  30. } catch (IOException e) {
  31. logger.error(e.getMessage());
  32. }
  33. }
  34. }

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

  1. java.lang.IllegalStateException: getOutputStream() has already been called for this response
  2. at org.apache.catalina.connector.Response.getWriter(Response.java:624) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
  3. at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
  4. at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
  5. 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代码就变成了这样

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

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

  1. 此文终!
  2. 谨以此纪念蠢蠢的自己

发表评论

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

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

相关阅读