分享
 
 
 

使用技巧:Java实现随机验证码功能实例

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

现在许多系统的注册、登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用。

验证码实际上就是随机选择一些字符以图片的形式展现在页面上,假如进行提交操作的同时需要将图片上的字符同时提交,假如提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度。

在这里,我们使用servlet来实现随机验证码的实现。

package com.servlet;

import Java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

/**

* 生成随机验证码

* @author bitiliu

*

*/

public class ValidateCodeServlet extends HttpServlet

{

private static final long serialVersionUID = 1L;

//验证码图片的宽度。

private int width=60;

//验证码图片的高度。

private int height=20;

//验证码字符个数

private int codeCount=4;

private int x=0;

//字体高度

private int fontHeight;

private int codeY;

char[] codeSequence = { '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' };

/**

* 初始化验证图片属性

*/

public void init() throws ServletException

{

//从web.XML中获取初始信息

//宽度

String strWidth=this.getInitParameter("width");

//高度

String strHeight=this.getInitParameter("height");

//字符个数

String strCodeCount=this.getInitParameter("codeCount");

//将配置的信息转换成数值

try

{

if(strWidth!=null && strWidth.length()!=0)

{

width=Integer.parseInt(strWidth);

}

if(strHeight!=null && strHeight.length()!=0)

{

height=Integer.parseInt(strHeight);

}

if(strCodeCount!=null && strCodeCount.length()!=0)

{

codeCount=Integer.parseInt(strCodeCount);

}

}

catch(NumberFormatException e)

{}

x=width/(codeCount+1);

fontHeight=height-2;

codeY=height-4;

}

protected void service(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, java.io.IOException {

//定义图像buffer

BufferedImage buffImg = new BufferedImage(

width, height,BufferedImage.TYPE_INT_RGB);

Graphics2D g = buffImg.createGraphics();

//创建一个随机数生成器类

Random random = new Random();

//将图像填充为白色

g.setColor(Color.WHITE);

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

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

Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);

//设置字体。

g.setFont(font);

//画边框。

g.setColor(Color.BLACK);

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

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

g.setColor(Color.BLACK);

for(int i = 0; i < 160; 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);

}

//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

StringBuffer randomCode = new StringBuffer();

int red = 0, green = 0, blue = 0;

//随机产生codeCount数字的验证码。

for (int i = 0; i < codeCount; i++) {

//得到随机产生的验证码数字。

String strRand = String.valueOf(codeSequence[random.nextInt(36)]);

//产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

red = random.nextInt(255);

green = random.nextInt(255);

blue = random.nextInt(255);

//用随机产生的颜色将验证码绘制到图像中。

g.setColor(new Color(red, green, blue));

g.drawString(strRand, (i + 1) * x, codeY);

//将产生的四个随机数组合在一起。

randomCode.append(strRand);

}

// 将四位数字的验证码保存到Session中。

HttpSession session = req.getSession();

session.setAttribute("validateCode", randomCode.toString());

// 禁止图像缓存。

resp.setHeader("Pragma", "no-cache");

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

resp.setDateHeader("EXPires", 0);

resp.setContentType("image/jpeg");

//将图像输出到Servlet输出流中。

ServletOutputStream sos = resp.getOutputStream();

ImageIO.write(buffImg, "jpeg", sos);

sos.close();

}

}

需要在web.xml中声明servlet

<servlet>

<servlet-name>ValidateCodeServlet</servlet-name>

<servlet-class>com.servlet.ValidateCodeServlet</servlet-class>

<init-param>

<param-name>width</param-name>

<param-value>200</param-value>

</init-param>

<init-param>

<param-name>height</param-name>

<param-value>80</param-value>

</init-param>

<init-param>

<param-name>codeCount</param-name>

<param-value>5</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>ValidateCodeServlet</servlet-name>

<url-pattern>/validateCodeServlet</url-pattern>

</servlet-mapping>

需要引用的页面可以这样来写:

<ccid_file values="validateCodeServlet" width="100/" />

用户提交后就可以将用户输入的验证码与session中保存的字符串进行比对,达到验证的效果。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有