您当前的位置: 首页 > 网站编程 > JSP教程 > JSP验证码getOutputStream的解决方法

JSP验证码getOutputStream的解决方法

作者:guanchaofeng 来源:本站整理 发布时间: 2009-11-02 09:28 点击:
使用JSP生成的验证码会报出异常:getOutputStream()hasalreadybeencalledforthisresponse,其原因就是输出流的问题,使用Servlet则解决了此问题以下是代码: /* *Image.java * *Createdon2006年7月13日,下午4:43 */ packagecom.tot.certcode; importjava.io.*

JSP验证码getOutputStream的解决方法

  使用JSP生成的验证码会报出异常:getOutputStream()hasalreadybeencalledforthisresponse,其原因就是输出流的问题,使用Servlet则解决了此问题以下是代码:
  
  /*
  *Image.java
  *
  *Createdon2006年7月13日,下午4:43
  */
  
  packagecom.tot.certcode;
  
  importjava.io.*;
  importjava.net.*;
  importjavax.servlet.*;
  importjavax.servlet.http.*;
  importjava.awt.*;
  importjava.awt.image.*;
  importjava.util.*;
  importjavax.imageio.*;
  /**
  *
  *@author
  *@version
  */
  publicclassImageextendsHttpServlet{
  
  /**ProcessesrequestsforbothHTTP<code>GET</code>and<code>POST</code>methods.
  *@paramrequestservletrequest
  *@paramresponseservletresponse
  */
  protectedvoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)
  throwsServletException,IOException{
  response.setContentType("image/jpeg");
  response.setHeader("Pragma","No-cache");
  response.setHeader("Cache-Control","no-cache");
  response.setDateHeader("Expires",0);
  HttpSessionsession=request.getSession();
  //在内存中创建图象
  intwidth=60,height=20;
  BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  
  //获取图形上下文
  Graphicsg=image.getGraphics();
  
  //生成随机类
  Randomrandom=newRandom();
  
  //设定背景色
  g.setColor(getRandColor(200,250));
  g.fillRect(0,0,width,height);
  
  //设定字体
  g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));
  
  //画边框
  //g.setColor(newColor());
  //g.drawRect(0,0,width-1,height-1);
  
  
  //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
  g.setColor(getRandColor(160,200));
  for(inti=0;i<155;i++){
  intx=random.nextInt(width);
  inty=random.nextInt(height);
  intxl=random.nextInt(12);
  intyl=random.nextInt(12);
  g.drawLine(x,y,x+xl,y+yl);
  }
  
  //取随机产生的认证码(4位数字)
  StringsRand="";
  for(inti=0;i<4;i++){
  Stringrand=String.valueOf(random.nextInt(10));
  sRand+=rand;
  //将认证码显示到图象中
  g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
  g.drawString(rand,13*i+6,16);
  }
  
  //将认证码存入SESSION
  session.setAttribute("rand",sRand);
  //图象生效
  g.dispose();
  ServletOutputStreamresponseOutputStream=response.getOutputStream();
  //输出图象到页面
  ImageIO.write(image,"JPEG",responseOutputStream);
  
  //以下关闭输入流!
  responseOutputStream.flush();
  responseOutputStream.close();
  }
  ColorgetRandColor(intfc,intbc){//给定范围获得随机颜色
  Randomrandom=newRandom();
  if(fc>255)fc=255;
  if(bc>255)bc=255;
  intr=fc+random.nextInt(bc-fc);
  intg=fc+random.nextInt(bc-fc);
  intb=fc+random.nextInt(bc-fc);
  returnnewColor(r,g,b);
  }
  //<editor-folddefaultstate="collapsed"desc="HttpServletmethods.Clickonthe+signonthelefttoeditthecode.">
  /**HandlestheHTTP<code>GET</code>method.
  *@paramrequestservletrequest
  *@paramresponseservletresponse
  */
  protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
  throwsServletException,IOException{
  processRequest(request,response);
  }
  
  /**HandlestheHTTP<code>POST</code>method.
  *@paramrequestservletrequest
  *@paramresponseservletresponse
  */
  protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
  throwsServletException,IOException{
  processRequest(request,response);
  }
  
  /**Returnsashortdescriptionoftheservlet.
  */
  publicStringgetServletInfo(){
  return"Shortdescription";
  }
  //</editor-fold>
  }

分享到:
本文"JSP验证码getOutputStream的解决方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4