java、jsp、struts2验证码的实现

上阶段我学习了验证码的技术,并作了小结,贴出来供大家参考。
分为以下四个步骤:
1.我写了了一个类,封装了验证码的相关属性及方法,以提高代码的重用性:
public class Captcha {
private ByteArrayInputStream inputStream;
private String randomCode;
//验证码背景的宽、高、字符数目、字体大小
public Captcha(int w,int h,int num,int fontsize) throws Exception {
init(w,h,num,fontsize);
}

private void init(int w,int h,int num,int fontsize) throws Exception {
// 在内存中创建图象
int width = w;
int height = h;
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);
// 设定字体
g.setFont(new Font("Times New Roman", Font.BOLD, fontsize));
// 随机产生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);
}
// 取随机产生的认证码(num位数字)
this.randomCode = this.getRandCode(g,num);
// 图象生效
g.dispose();

ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
ByteArrayInputStream input = new ByteArrayInputStream(output
.toByteArray());
this.setInputStream(input);
}

private String getRandCode(Graphics g,int num) {
Random random = new Random();
char c[] = new char[62];

for (int i = 97, j = 0; i < 123; i++, j++) {
c[j] = (char) i;
}
for (int o = 65, p = 26; o < 91; o++, p++) {
c[p] = (char) o;
}
for (int m = 48, n = 52; m < 58; m++, n++) {
c[n] = (char) m;
}
String sRand = "";
for (int i = 0; i < num; i++) {
int x = random.nextInt(62);
String rand = String.valueOf(c[x]);
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);
}
return sRand;
}

// 给定范围获得随机颜色
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);
}

public void setRandomCode(String randomCode) {
this.randomCode = randomCode;
}

public String getRandomCode() throws Exception {
return this.randomCode;
}

public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}

public ByteArrayInputStream getInputStream() {
return inputStream;
}

}
2.现在就可以使用上面的类了,请看下面的struts2的Action类:
public class CaptchaAction extends ActionSupport {
private ByteArrayInputStream inputStream;

private Captcha captcha;
private HttpServletRequest request;
private HttpSession session;


public ByteArrayInputStream getInputStream() {
return inputStream;
}

public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}

public String execute() throws Exception {
request = ServletActionContext.getRequest();
session = request.getSession();

captcha = new Captcha(90,20,6,20);
this.setInputStream(captcha.getInputStream());
//将生成的字符放入Session中,以备验证
session.setAttribute("captchacode", captcha.getRandomCode());
return SUCCESS;
}

}
3.现在可以编写客户端代码了:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>test</title>
<script type="text/javascript" src="Lib/prototype.js"></script>
</head>
<body>
<img id="img_c" src="captcha.action" /><a id="a_ref" href="#">刷新</a>
<SCRIPT type="text/javascript">
$('a_ref').observe('click',function(){
var timenow = new Date().getTime();
$('img_c').src="captcha.action?d="+timenow;
})
</SCRIPT>
</body>
</html>
4.最后配置一下struts2配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="captcha" class="com.webims.action.CaptchaAction">
<!-定义输出参数的格式-->
<result type="stream">
<param name="contentType">image/gif</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
终于大功告成了,我封装了验证码的类,只要理解原理,不论是不使用框架,还是使用框架,使用什么框架,都一样,不是吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值