JSP验证码getOutputStream的处理方法
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>
}