2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > java web中 生成图片验证码 转自逍遥郎

java web中 生成图片验证码 转自逍遥郎

时间:2018-10-08 02:11:28

相关推荐

java web中 生成图片验证码 转自逍遥郎

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,这个可以根据自己的喜好弄,值得注意的是每次访问时后边必须跟一个唯一的字符,不然浏览器会认为跟刚才一样所以就直接显示,导致验证码不会变化。

本文转自逍遥郎。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。