1、login.jsp页面
程序 复制代码代码如下所示:
功能changevalidatecode(obj){
作为一个
参数,获取当前时间,没有具体含义。
VaR办法=新的
日期()GetTime();
每个请求都需要一个不同的参数,否则它将返回相同的验证代码。
有缓存机制和
浏览器,也可以使页面不缓存,所以你没有参数。
obj。src=兰特。actiond =+办法;
}
在表格中加上下列句子:
复制代码代码如下所示:
:
2类
文件,randomnumutil.java生成验证码
复制代码代码如下所示:
进口java.awt.color;
进口java.awt.font;
进口java.awt.graphics;
进口java.awt.image.bufferedimage;
进口java.io.bytearrayinputstream;
进口java.io.bytearrayoutputstream;
进口java.util.random;
进口javax.imageio.imageio;
进口javax.imageio.stream.imageoutputstream;
公共课randomnumutil {
私人从字节数组读取的
输入流图像; / /图像
私有字符串STR;验证代码
列兵RandomNumUtil(){
(init);
}
*
*获得randomnumutil例
* /
公共静态RandomNumUtil Instance(){
返回新的randomnumutil();
}
*
*获得验证
图片 * /
公众从字节数组读取的输入流的图像(){
返回this.image;
}
*
*获取图片验证码
* /
公共字符串GetString(){
返回this.str;
}
私有空init(){
在
内存中
创建图像
int宽度= 85,高度= 20;
BufferedImage图像=新的BufferedImage(宽度,高度,type_int_rgb BufferedImage。);
获取图形上下文
图G = image.getgraphics();
随机生成
随机随机数=新随机数();
设置背景色
G.setColor(getrandcolor(200250));
g.fillrect(0, 0,宽度,高度);
字体 g.setfont(新字体(时代新罗马
155随机干扰线,图像的认证码不易被其他程序
检测到。
G.setColor(getrandcolor(160200));
对于(int = i 0;i < 155;i + +)
{
int x = random.nextint(宽);
y = random.nextint(高度);
int XL = random.nextint(12);
int YL = random.nextint(12);
G.drawLine(X,Y,X + Y + XL,YL);
}
获取随机验证码(6位)
字符串= 、;
对于(int = i 0;i < 6;i + +){
字符串兰德= string.valueof(random.nextint(10));
srand + =兰特;
身份验证代码是图像
显示。
g.setcolor(新的颜色(20 + random.nextint(110),20(110),random.nextint + 20 + random.nextint(110))));
调用相同的颜色,可能是因为种子太近,所以只能直接生成。
g.drawstring(Rand,13 *我+ 6,16);
}
赋值/验证码
这力量=站;
图像/效果
G.dispose();
从字节数组读取的输入流输入= null;
写入字节数组的输出流输出=新写入字节数组的输出流();
尝试{
imageoutputstream imageout = imageio.createimageoutputstream(输出);
imageio.write(图像,JPEG
ImageOut.close();
输入=新从字节数组读取的输入流(output.tobytearray());
} catch(异常E){
System.out.println(验证码图片产生的
错误:+ e.tostring());
}
这个,图像=输入;图像赋值
}
*
*在给定范围内获得随机颜色
* /
私人色彩getrandcolor(int FC,int BC){
随机随机数=新随机数();
如果(FC > 255)FC = 255;
如果(BC = 255)BC = 255;
int r = FC + random.nextint(公元前FC);
int G = FC + random.nextint(公元前FC);
int b = FC + random.nextint(公元前FC);
返回新的颜色(r,G,b);
}
}
3、randomaction.java行动程序生成验证码
复制代码代码如下所示:
进口java.io.bytearrayinputstream;
进口com.mxl.util.randomnumutil;
进口com.opensymphony.xwork2.actioncontext;
进口com.opensymphony.xwork2.actionsupport;
公共课randomaction
扩展ActionSupport {
私人从字节数组读取的输入流InputStream;
公共字符串
执行()抛出异常{
randomnumutil rdnu = randomnumutil.instance();
this.setinputstream((rdnu。GetImage)); / /得到一个随机字符串。
actioncontext.getcontext(。getsession)(,)(随机)(rdnu。GetString); / /得到一个随机字符串到HttpSession
返回成功;
}
公共无效setinputstream(从字节数组读取的输入流InputStream){
this.inputstream = InputStream;
}
公众从字节数组读取的输入流getInputStream(){
返回输入流;
}
}
4、loginaction.java验证验证码的
作用 复制代码代码如下所示:
私有字符串兰德;以兰德的形式
公共字符串getRand(){
返回兰德;
}
公共无效setrand(字符串兰特){
this.rand =兰特;
}
拆下randomaction.java / /验证码生成随机从会话
字符串随机=(字符串)(actioncontext.getcontext()GetSession(),有(随机));
以下是会话
保存代码、验证码、字符串比较和客户输入。
如果(arandom.equals(this.getrand())){
ActionContext.getContext()GetSession(),把(
用户 返回成功;
}
{其他
返回错误;
}
5。Struts.xml文件
配置 复制代码代码如下所示:
图像/ JPEG
InputStream
6。生成的验证码图片演示(6位数字验证码的实现)
解释uff1a
如果要
修改生成的验证代码的数量,需要修改以下
位置:
第一点:
int宽度= 85,高度= 20;int宽度= 85,高度= 20;
第二点:(int i = 0;i < 6;i +)为(int i=0;i < 6;i +)
数字6,更改为要生成的位数。