response.getOutputStream().write(1)在mozilla firefox 64位中运行,为什么是弹窗????

getWriter() 和Response.getOutputStream冲突 - ITeye问答
遇到一个比较烦恼的问题,之前在struts1.2上挺正常的代码,到struts2.0上总是报
getWriter() has already been called for this response
场景是这样的:
我使用自定义的table标签实现导excel,以前struts1.2也出现过这些问题,后来只要在jsp页面中不使用&% %&java代码就解决了,
但迁移到struts2时又报这样的问题了,郁闷!
查了很多资料网上的解决办法如下:
在写jsp或使用标签以及做文件下载时经常会遇到getWriter() 和Response.getOutputStream冲突报java.lang.IllegalStateException: getWriter() has already been called for this response
这样的异常,网上大多数说是在代码后面增加
bodyContent.clear();bodyContent = pageContext.pushBody();
参考文章:
// /pageContext.getResponse().reset();
HttpServletResponse response = (HttpServletResponse) pageContext
.getResponse();
* if (response.isCommitted()) response.reset();
response.reset();
} catch (IllegalStateException ie) {
ie.printStackTrace();
response.setContentType("application/x-download");// 设置为下载application/x-download
String downFile = (fileName == null ? Long.toString(System
.currentTimeMillis()) : fileName)
+ "." + extN
response.setHeader("Content-Disposition", "filename="
+ URLEncoder.encode(downFile, "UTF-8"));
OutputStream out = response.getOutputStream();
xlsFile.write(out);
out.flush();
out.close();
response.flushBuffer();
bodyContent.clear();
bodyContent = pageContext.pushBody();
} catch (Exception e) {
e.printStackTrace();
但还是在OutputStream out = response.getOutputStream();报错,所以google又有文章说在response.setContentType前增加
response.reset();解决问题,但增加这一句后问题还是存在,报新异常:
java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)
不知道谁有这方面经历,能够体系化的把这个问题做个解决!
出现这个问题的原因在于,你已经打开了一个页面输出流,所以不能打开第二个,在打开的时候,你要检测是否在用,或者是close一下流
已解决问题
未解决问题您现在的位置:&&>>&电脑频道&>>&&>>&登录页面验证码的简单实现,以及getOutputStream() has already been called for this response异常的解决方法
登录页面验证码的简单实现,以及getOutputStream() has already been called for this response异常的解决方法
作者:佚名&&&&来源:网友投稿&&&&点击数:&&&&更新时间:
最近自己在倒腾一个网上订餐系统,在做登录验证时,需用JSP向网页中输出一张验证码图片,现将本人的验证码简单实现方法拿出来与大家分享,如有不足,还请指正。效果图:1.先写一个产生随机字符串的工具类,方法有很多种,下面给出本人实现代码,仅供参考:RandomCode.java:package com.sun.food.import java.util.ArrayLimport java.util.Cpublic class RandomCode {// 建立一个字符串池private static ArrayList&Character& pool = new ArrayList&Character&();// 向字符串池中放入&0~9&,&a~z&,&A~Z&等字符static {for (int i = 0; i & 10; i++) {pool.add(new Character((char) (i + 48)));}for (int i = 0; i & 26; i++) {pool.add(new Character((char) (i + 65)));}for (int i = 0; i & 26; i++) {pool.add(new Character((char) (i + 97)));}}// 获得指定位数的随机字符串public static String getRandomCode(int codeLength) {String result = "";for (int i = 0; i & codeL i++) {// 打散集合排列顺序Collections.shuffle(pool);// 每次循环取第1个元素result += pool.get(1);}}}   2.然后写一个jsp代码,用于向页面中输出验证码图片,下面给出具体代码:  SecurityCode.jsp:&%@ pageimport="java.awt.image.*,javax.imageio.*,java.io.*,java.awt.*,com.sun.food.utils.*"pageEncoding="utf-8"%&&%String randomCode = RandomCode.getRandomCode(4);//将随机字符串写入session,以便将来在servlet中进行校验//且当用户刷新页面时,将已有的字符串删除,写入最新的验证码,使其与显示图片同步request.getSession().removeAttribute("securityCode");request.getSession().setAttribute("securityCode", randomCode);//定义输出图片大小BufferedImage image = new BufferedImage(50, 20,BufferedImage.TYPE_INT_RGB);//获得画笔Graphics g = image.getGraphics();//设置画笔颜色:红色g.setColor(new Color(0xff0000));//在画布上背景全部填充为红色g.fillRect(0, 0, 50, 20);//设置画笔颜色:蓝色g.setColor(new Color(0x0000ff));//设置画笔字体:Arial,粗体,大小15g.setFont(new Font("Arial", Font.BOLD, 15));//将随机字符串画在画布上,并调整初始位置,使其居中g.drawString(randomCode, 5, 16);//销毁画笔g.dispose();//获得输出流OutputStream os = response.getOutputStream();//向输出流中输出图片ImageIO.write(image, "bmp", os);//关闭输出流os.flush();os.close();%& 注:此jsp代码开头需import在第1步中写好的工具类&RandomCode.java&,本人代码位于&com.sun.food.utils&中,大家在使用时需替换成自己的工具类包名。3.在其他jsp页面中调用第2步所生成的bmp图像在其他页面中加入以下代码即可:&img src="SecurityCode.jsp"&其中src值为第2步jsp所在路径4.如何校验验证码是否正确?在servlet中,你可以先获得表单中用户输入的验证码字符串然后,再获得第2步放入session中的&securityCode&对象,然后比较2者是否相同提醒一下,若想使校验更人性化点,需用equalsIgnoreCase()方法取代你的equals()方法。此步不再给出具体代码,大家可以自由发挥。至此,一个简单的验证码的功能基本上就实现了,大家有兴趣的话,还可以将第2步的jsp输出的图片弄的更复杂点。可能大家按照上面的步骤做下来,在服务器端会抛getOutputStream() has already been called for this response异常,下面给出异常原因及解决方法:jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码:finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); }这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。解决的方法有2种:1.在使用完输出流以后调用以下两行代码即可:(即第2步代码末尾处)out.clear();out = pageContext.pushBody();2.JSP默认的输出流为PrintWriter ,即&% %&以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.对于这样的情况应该这样来解决,删除%&&%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句response.reset()。最后大家有更好的验证码实现方式可以留言给我,大家一起交流下!查看和“验证码”有关的所有文章
上一篇文章:
下一篇文章:

我要回帖

更多关于 mozilla firefox wiki 的文章

 

随机推荐