java调用jsp验证码_java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

一、使用纯Servlet实现验证码

(1)在web.xml配置:

image

org.test.web.AuthImage

image

/authImage

(2)servlet源码

publicclassAuthImageextendsHttpServlet

{

privatestaticfinalString CONTENT_TYPE ="text/html; charset=gb2312";

//设置字母的大小,大小

privateFont mFont =newFont("Times New Roman", Font.PLAIN,17);

publicvoidinit()throwsServletException

{

super.init();

}

Color getRandColor(intfc,intbc)

{

Random random = 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);

}

publicvoidservice(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException

{

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires",0);

//表明生成的响应是图片

response.setContentType("image/jpeg");

intwidth=100, height=18;

BufferedImage image = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

Random random = newRandom();

g.setColor(getRandColor(200,250));

g.fillRect(1,1, width-1, height-1);

g.setColor(newColor(102,102,102));

g.drawRect(0,0, width-1, height-1);

g.setFont(mFont);

g.setColor(getRandColor(160,200));

//画随机线

for(inti=0;i<155;i++)

{

intx = random.nextInt(width -1);

inty = random.nextInt(height -1);

intxl = random.nextInt(6) +1;

intyl = random.nextInt(12) +1;

g.drawLine(x,y,x + xl,y + yl);

}

//从另一方向画随机线

for(inti =0;i <70;i++)

{

intx = random.nextInt(width -1);

inty = random.nextInt(height -1);

intxl = random.nextInt(12) +1;

intyl = random.nextInt(6) +1;

g.drawLine(x,y,x - xl,y - yl);

}

//生成随机数,并将随机数字转换为字母

String sRand="";

for(inti=0;i<6;i++)

{

intitmp = random.nextInt(26) +65;

charctmp = (char)itmp;

sRand += String.valueOf(ctmp);

g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

g.drawString(String.valueOf(ctmp),15*i+10,16);

}

HttpSession session = request.getSession(true);

session.setAttribute("rand",sRand);

g.dispose();

ImageIO.write(image, "JPEG", response.getOutputStream());

}

publicvoiddestroy()

{

}

}

(3)页面显示

二、使用纯jsp实现验证码

contentType="image/jpeg"pageEncoding="UTF-8"%>

response.setHeader("Pragma","No-cache");

response.setHeader("Cahce-Control","no-cache");

response.setDateHeader("Expires",0);

//在内存中创建图片

intwidth=60,height=20;

BufferedImage image=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//获取图形上下文

Graphics g= image.getGraphics();

//生成随机类

Random random= newRandom();

//设置背景颜色

g.setColor(newColor(160,200,100));

g.fillRect(0,0,width,height);

//设置字体

g.setFont(newFont("Times New Roman",Font.PLAIN,18));

//随机产生50条干扰线,使图形中的验证码不易被其他的程序探测到

g.setColor(newColor(160,200,200));

for(inti=0;i<50;i++)

{

intx=random.nextInt(width);

inty=random.nextInt(height);

intx1=random.nextInt(width);

inty1=random.nextInt(height);

g.drawLine(x,y,x+x1,y+y1);

}

//随机产生验证码(6位数字)

String sRand="";

for(inti=0;i<6;i++)

{

String rand=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.setAttribute("rand",sRand);//将产生的验证码存储到sesson中

g.dispose();

ImageIO.write(image,"JPEG",response.getOutputStream());

out.clear(); //***********

out=pageContext.pushBody();//**********

%>

三、使用Struts2来实现验证码

(1)定义一个生成验证码的工具类

packagecom.cn.hospital.util;

importjava.awt.Color;

importjava.awt.Font;

importjava.awt.Graphics;

importjava.awt.image.BufferedImage;

importjava.io.ByteArrayInputStream;

importjava.io.ByteArrayOutputStream;

importjava.util.Random;

importjavax.imageio.ImageIO;

importjavax.imageio.stream.ImageOutputStream;

publicclassRandomNumUtil {

privateByteArrayInputStream image;//图像

privateString str;//验证码

privateRandomNumUtil(){

init();//初始化属性

}

/*

* 取得RandomNumUtil实例

*/

publicstaticRandomNumUtil Instance(){

returnnewRandomNumUtil();

}

/*

* 取得验证码图片

*/

publicByteArrayInputStream getImage(){

returnthis.image;

}

/*

* 取得图片的验证码

*/

publicString getString(){

returnthis.str;

}

privatevoidinit() {

// 在内存中创建图象

intwidth=85, height=20;

BufferedImage image = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文

Graphics g = image.getGraphics();

// 生成随机类

Random random = newRandom();

// 设定背景色

g.setColor(getRandColor(200,250));

g.fillRect(0,0, width, height);

// 设定字体

g.setFont(newFont("Times New Roman",Font.PLAIN,18));

// 随机产生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);

}

// 取随机产生的认证码(6位数字)

String sRand="";

for(inti=0;i<6;i++){

String rand=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);

}

//赋值验证码

this.str=sRand;

//图象生效

g.dispose();

ByteArrayInputStream input=null;

ByteArrayOutputStream output = newByteArrayOutputStream();

try{

ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);

ImageIO.write(image, "JPEG", imageOut);

imageOut.close();

input = newByteArrayInputStream(output.toByteArray());

}catch(Exception e){

System.out.println("验证码图片产生出现错误:"+e.toString());

}

this.image=input;/* 赋值图像 */

}

/*

* 给定范围获得随机颜色

*/

privateColor getRandColor(intfc,intbc){

Random random = 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);

}

}

(2)定义一个验证码输出的action

packagecom.cn.hospital.action;

importjava.io.ByteArrayInputStream;

importjava.io.ByteArrayOutputStream;

importorg.springframework.context.annotation.Scope;

importorg.springframework.stereotype.Controller;

importcom.cn.hospital.util.RandomCharUtil;

importcom.cn.hospital.util.RandomNumUtil;

importcom.opensymphony.xwork2.ActionContext;

importcom.opensymphony.xwork2.ActionSupport;

("utilAction")

@Scope("prototype")

publicclassUtilActionextendsActionSupport{

privatestaticfinallongserialVersionUID = -7193209177116825032L;

privateByteArrayInputStream inputStream;

privateintwidth;

privateintheight;

privateintfontSize;

privateintcodeLength;

privateintdisturbType;

publicString validNumGenerate()throwsException{

RandomNumUtil rdnu=RandomNumUtil.Instance();

this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片

ActionContext.getContext().getSession().put("random", rdnu.getString());//取得随机字符串放入HttpSession

returnSUCCESS;

}

publicvoidsetInputStream(ByteArrayInputStream inputStream) {

this.inputStream = inputStream;

}

publicByteArrayInputStream getInputStream() {

returninputStream;

}

}

(3)struts.xml配置

image/jpeg

inputStream

四、小结

对于java的web技术,归根究底还是在服务器端执行的servlet.从上面的三种不同实现中,我们很容易察觉到他们存在一个共同点,那就是返回浏览器端的contentType。

servlet:使用response.setContentType(" ");方法来实现

jsp:在中来实现

struts2:通过配置 来实现

至于验证码的产生其实比较简单,在这里就不深究了。就此一点小感想,与同行共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值