问题产生背景:博主最近加了一个生成验证码的功能,然后配置巴拉巴拉配置好了,发出请求获取验证码。
这个是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
感觉自己呆呆的。。。
此文终!
谨以此纪念蠢蠢的自己