您的位置:首页 > 编程语言 > Java开发

Java实现产生一个随机验证码

2013-01-29 11:12 477 查看
首先,写一个生成验证码的类:RandomNumUtil.java

package test.util;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.imageio.stream.ImageOutputStream;

public class RandomNumUtil {

private ByteArrayInputStream image;//图像

private String str;//验证码

//验证码序列。

private static final char[] randomSequence = new char[] { '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' };

private RandomNumUtil(){

init();//初始化属性

}

public static RandomNumUtil Instance(){

return new RandomNumUtil();

}

public ByteArrayInputStream getImage(){

return this.image;

}

public String getString(){

return this.str;

}

private void init() {

// 在内存中创建图象

int width=85, height=20;

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

// 获取图形上下文

Graphics g = image.getGraphics();

// 生成随机类

Random random = new Random();

// 设定背景色

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

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

//创建字体,字体的大小应该根据图片的高度来定。

Font font = new Font("Times New Roman", Font.PLAIN, height-2);

//设置字体。

g.setFont(font);

//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到

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

for (int i=0;i<155;i )

{

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

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

}

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

String sRand="";

for (int i=0;i<6;i ){

int index = random.nextInt(35);

String rand = String.valueOf(randomSequence[index]);

sRand =rand;

// 将认证码显示到图象中

g.setColor(new Color(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 = new ByteArrayOutputStream();

try{

ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);

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

imageOut.close();

input = new ByteArrayInputStream(output.toByteArray());

}catch(Exception e){

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

}

this.image=input;

}

private Color getRandColor(int fc,int bc){

Random random = new Random();

if(fc>255) fc=255;

if(bc>255) bc=255;

int r=fc random.nextInt(bc-fc);

int g=fc random.nextInt(bc-fc);

int b=fc random.nextInt(bc-fc);

return new Color(r,g,b);

}

}

接下来编写action类:RandomAction.java

package test.action;

import java.io.ByteArrayInputStream;

import test.util.RandomNumUtil;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")

public class RandomAction extends ActionSupport{

private ByteArrayInputStream inputStream;

public String execute() throws Exception{

RandomNumUtil rdnu=RandomNumUtil.Instance();

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

String str = rdnu.getString().toString();

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

return SUCCESS;

}

public void setInputStream(ByteArrayInputStream inputStream) {

this.inputStream = inputStream;

}

public ByteArrayInputStream getInputStream() {

return inputStream;

}

}

写完action类后,别忘了在struts.xml文件中配置:

<action name="rand" class="test.RandomAction">

<result type="stream">

<param name="contentType">image/jpeg</param>

<param name="inputName">inputStream</param>

</result>

</action>

最后,写一个jsp文件就可以测试验证码功能了:index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>

<body>

<script type="text/javascript">

function changeValidateCode(obj) {

//获取当前的时间作为参数,无具体意义

var timenow = new Date().getTime();

//每次请求需要一个不同的参数,否则可能会返回同样的验证码

//这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。

obj.src="rand.action?d=" timenow;

}

</script>

<form action="check" method="post">

<input type="text" name="str">

<input type="submit">

</form>

<img src="rand.action" onclick="changeValidateCode(this)" alt="看不清楚?点击刷新"/>

${message }

</body>

</html>

以上只是验证码的现实,接下来实现验证码的验证:

首先书写验证验证码的action:CheckAction .java

package test.action;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")

public class CheckAction extends ActionSupport{

private String str;//客户输入的图片验证码

private String message;

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

public String execute(){

String str2=(String)(ActionContext.getContext().getSession().get("random"));//取得session保存中的字符串

//下面就是将session中保存验证码字符串与客户输入的验证码字符串对比了

if(str2.equals(this.getStr())){

message = "O(∩_∩)O哈哈~验证码正确";

return SUCCESS;

}else{

message = "~~~~(>_<)~~~~ 验证码错误";

return INPUT;

}

}

public String getStr() {

return str;

}

public void setStr(String str) {

this.str = str;

}

}

然后配置验证actino:

struts.xml:

<action name="check" class="tes.CheckAction">

<result name="success">/index.jsp</result>

<result name="input">/index.jsp</result>

</action>

至此,完整的完成了验证码的验证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐