1、首先新建一各专门生成验证码图片的类VerifyCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
public class VerifyCode {
private int w= 70 ;
private int h= 35 ;
private Random r= new Random();
//宋体,华文楷书,黑体,华文新魏,华文隶书,微软雅黑,楷体_GB2312,Times New Roman
private String [] fontNames={ "宋体" , "华文楷书" , "黑体" , "华文新魏" , "微软雅黑" , "华文隶书" , "楷体_GB2312" , "Times New Roman" };
//可选的字符
private String codes= "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ" ;
//背景色
private Color bgColor= new Color( 255 , 255 , 255 );
//验证码上的文本
private String text;
//生成随机颜色
private Color randomColor(){
int red=r.nextInt( 150 );
int green=r.nextInt( 150 );
int blue=r.nextInt( 150 );
return new Color(red,green,blue);
}
//生成随机字体
private Font randomFont(){
int index=r.nextInt(fontNames.length); //获取下标
String fontName=fontNames[index]; //生成随机的字体名称
int style=r.nextInt( 4 ); //获取随机样式,0表示无样式,1表示粗体,2表示斜体,3表示粗体加斜体
int size=r.nextInt( 5 )+ 24 ; //生成随机字号,24~28
return new Font(fontName,style,size);
}
//画干扰线
private void drawLine(BufferedImage image){
int num= 3 ; //一共画3条
Graphics2D g2=(Graphics2D) image.getGraphics();
for ( int i= 0 ;i<num;i++){ //随机生成坐标,即4个值
int x1=r.nextInt(w);
int y1=r.nextInt(h);
int x2=r.nextInt(w);
int y2=r.nextInt(h);
g2.setStroke( new BasicStroke( 1 .5F)); //设置笔画的宽度
g2.setColor(Color.blue); //干扰线颜色
g2.drawLine(x1, y1, x2, y2); //画线
}
}
//随机生成一个字符
private char randomChar(){
int index=r.nextInt(codes.length());
return codes.charAt(index);
}
//创建BufferedImage
private BufferedImage createImage(){
BufferedImage image= new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2=(Graphics2D) image.getGraphics();
g2.setColor( this .bgColor);
g2.fillRect( 0 , 0 , w, h);
return image;
}
//外界调用这个方法得到验证码
public BufferedImage getImage(){
BufferedImage image=createImage(); //创建图片缓冲区
Graphics2D g2=(Graphics2D)image.getGraphics(); //得到绘制环境
StringBuilder sb= new StringBuilder(); //用来装载生成的验证码文本
//向图中画4个字符
for ( int i= 0 ;i< 4 ;i++){ //循环4次
String s=randomChar()+ "" ; //随机生成一个字符
sb.append(s); //把字母添加到sb中
double x=i* 1.0 *w/ 4 ; //设置当前字符的x轴坐标
g2.setFont(randomFont()); //设置随机字体
g2.setColor(randomColor()); //设置随机颜色
g2.drawString(s, ( int )x, h- 5 );
}
this .text=sb.toString(); //把生成的字符串赋给了this.text
drawLine(image); //添加干扰线
return image;
}
//返回验证码图片上面的文本
public String getText(){
return text;
}
//保存图片到指定的输出流
public static void output(BufferedImage image,OutputStream out) throws IOException{
ImageIO.write(image, "JPEG" , out);
}
}
|
2、在jsp页面上应用:
其核心代码如下:
1
2
3
4
5
6
7
8
|
< form action = "/test/LoginServlet" method = "post" >
用户名:< input type = "text" name = "username" value="<%=uname %>">< br >
密 码:< input type = "password" name = "password" >< br >
验证码:< input type = "text" name = "verifyCode" >
< img id = "img" src = "/test/VerifyCodeServlet" >
< a href = "JavaScript:_change()" rel = "external nofollow" >看不清换一张</ a >< br >
< input type = "submit" value = "登录" >
</ form >
|
看不清换一张使用javascript实现,代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
<script type= "text/javascript" >
function _change(){
/**
*1.得到image图片
*2.修改其src为/test/VerifyCodeServlet
*/
var imgEle=document.getElementById( "img" );
imgEle.src= "/test/VerifyCodeServlet?a=" + new Date().getTime();
}
</script>
|
+new Date().getTime()这条语句可以欺骗浏览器,以为请求是新的,实现验证码的改变。
3、在第2步中,VerifyCodeServlet的实现生成一张验证码,并且通过session域保存验证码图片对应的文本内容,为后面的登录验证验证码是否正确做准备。核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class VerifyCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.生成图片
* 2.保存图片上的文本到session域中
* 3.把图片响应给客户端
*/
VerifyCode vc= new VerifyCode();
BufferedImage image=vc.getImage();
//保存图片上的文本到session域
request.getSession().setAttribute( "session_code" , vc.getText());
VerifyCode.output(image, response.getOutputStream());
}
}
|
4、最后一步,实现登录验证验证码是否正确,其核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 校验验证码
* 1.从session中获取正取的验证码
* 2.从表单中获取用户填写的验证码
* 3.进行比较
* 4.如果相同,向下运行,否则保存错误信息到request域,转发到login.jsp
*/
String sessionCode=(String)
request.getSession().getAttribute( "session_code" ); //获得的验证码里面对应的文本内容
String paramCode=request.getParameter( "verifyCode" ); //用户输入文本框里面的内容
if (!paramCode.equalsIgnoreCase(sessionCode)){
request.setAttribute( "msg" , "验证码错误!" );
request.getRequestDispatcher( "/login.jsp" ).forward(request, response); //打回到登录界面。
return ; //返回,不继续执行下面的语句。
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。