javaWeb中图片验证码的生成
废话不多说,直接进入主题,javaWeb中生成验证码并在jsp上显示,我这里是用的Struts2,所以分为三步,第一,写Action,第二,写Struts.xml,第三,写jsp
第 一步,编写Action,这里用到了session(要把生成的验证码放到session中)切其他的Action很多都会用到 sessionrequestresponse等,所以我在这里写了个BaseAction在这里得到 sessionrequestresponse,然后其他的Action都继承它,就不同在其他每个用到这些的里边获得这些了,代码如下
packageorg.xiaoyaolang.action;
importjava.util.Map;
importjavax.servlet.ServletContext;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts2.interceptor.ServletRequestAware;
importorg.apache.struts2.interceptor.ServletResponseAware;
importorg.apache.struts2.interceptor.SessionAware;
importorg.apache.struts2.util.ServletContextAware;
/**
*基本Action
*@authorxiaoyaolang
*
*/
publicclassBaseActionimplementsSessionAware,ServletContextAware,ServletRequestAware,ServletResponseAware{
protectedMap<String,Object>session;
protectedServletContextctx;
protectedstaticHttpServletRequestrequest;
protectedHttpServletResponseresponse;
publicStringexecute()throwsException{
return"success";
}
publicvoidsetSession(Map<String,Object>session){
this.session=session;
}
publicvoidsetServletContext(ServletContextctx){
this.ctx=ctx;
}
publicvoidsetServletRequest(HttpServletRequestrequest){
this.request=request;
}
publicvoidsetServletResponse(HttpServletResponseresponse){
this.response=response;
}
}
然后是生成验证码图片的代码
packageorg.xiaoyaolang.action;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.p_w_picpath.BufferedImage;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
importjava.util.Random;
importorg.xiaoyaolang.action.BaseAction;
importcom.sun.p_w_picpath.codec.jpeg.JPEGCodec;
importcom.sun.p_w_picpath.codec.jpeg.JPEGImageEncoder;
/**
*验证码显示Action
*@authorxiaoyaolang
*
*/
publicclassImageCodeActionextendsBaseAction{
//图片的宽度
privatestaticintWIDTH=100;
//图片的高度
privatestaticintHEIGHT=40;
//验证码上字符数
privatestaticintNUM=4;
privatestaticchar[]seq={'A','B','C','D','E','F','G','H','I',
'J','K','L','M','N','O','P','Q','R','S','T','U','V',
'W','X','Y','Z','0','1','2','3','4','5','6','7','8',
'9'};
privateInputStreamis;
publicStringexecute(){
byte[]data=randomImage();
is=newByteArrayInputStream(data);
return"success";
}
/**
*生成图片
*@return
*/
privatebyte[]randomImage(){
Randomr=newRandom();
//图片的内存映像
BufferedImagep_w_picpath=newBufferedImage(WIDTH,HEIGHT,
BufferedImage.TYPE_INT_RGB);
//获得画笔对象
Graphicsg=p_w_picpath.getGraphics();
g.setColor(randomColor(r));
g.fillRect(0,0,WIDTH,HEIGHT);
g.setColor(newColor(0,0,0));
//用于存储随机生成的验证码
StringBuffernumber=newStringBuffer();
//绘制验证码
for(inti=0;i<NUM;i++){
g.setColor(randomColor(r));
inth=(int)((HEIGHT*60/100)*r.nextDouble()+(HEIGHT*30/100));
g.setFont(newFont(null,Font.BOLD|Font.ITALIC,h));
Stringch=String.valueOf(seq[r.nextInt(seq.length)]);
number.append(ch);
g.drawString(ch,i*WIDTH/NUM*90/100,h);
}
//将验证码打印到控制台方便查看调试,但是当程序真正上线的时候一定要删掉哦
System.out.println(number.toString());
//将验证码放入到session中
session.put("code",number.toString());
//绘制干扰线,这里绘制12条,如果感觉太乱,可以减少点
for(inti=0;i<=12;i++){
g.setColor(randomColor(r));
g.drawLine(r.nextInt(WIDTH),r.nextInt(HEIGHT),r.nextInt(WIDTH),r
.nextInt(HEIGHT));
}
ByteArrayOutputStreamos=newByteArrayOutputStream();
JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(os);
//把BufferedImage对象中的图像信息编码后
//向创建该对象(encoder)时指定的输出流输出
try{
encoder.encode(p_w_picpath);
returnos.toByteArray();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
privateColorrandomColor(Randomr){
returnnewColor(r.nextInt(255),r.nextInt(255),r.nextInt(255));
}
publicInputStreamgetIs(){
returnis;
}
publicvoidsetIs(InputStreamis){
this.is=is;
}
}
到这基本上完成了一大半了,下边就是配置struts.xml了
第二,Struts.xml中配置Action,该部分的代码如下
<!--生成验证码图片-->
<actionname="p_w_picpathcode"class="org.tarena.action.ImageCodeAction">
<resultname="success"type="stream">
<paramname="inputName">is</param>
<paramname="contentType">p_w_picpath/jpeg</param>
</result>
</action>
到此基本上算是完成了,只要在你需要验证码的页面上访问该Action就行了
第三,页面中访问Action,显示验证码,该部分代码如下
<imgid='imgVcode'src="p_w_picpathcode.action"/>
当然还得有“看不清换一张”代码如下
<ahref="javascript:;"
οnclick="document.getElementById('imgVcode').src='p_w_picpathcode.action?'+newDate()">看不清楚?换个图片</a>
这是个超链接的形式,当然你也可以直接在图片上加个onclick事件来访问这个Action,这个可以根据自己的喜好弄,值得注意的是每次访问时后边必须跟一个唯一的字符,不然浏览器会认为跟刚才一样所以就直接显示,导致验证码不会变化。
本文转自逍遥郎。