java 验证码

java图片验证码3

 
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package com;
  
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
  
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
  
public class PictureCheckCode extends HttpServlet {
     public PictureCheckCode() {
         super();
     }
  
     public void destroy() {
         super.destroy();
     }
  
     public void init() throws ServletException {
         super.init();
     }
  
     // 获取随机颜色
     public Color getRandColor(int s, int e) {
         Random random = new Random();
         if (s > 255)
             s = 255;
         if (e > 255)
             e = 255;
         int r = s + random.nextInt(e - s); // 随机生成RGB颜色中的r值
         int g = s + random.nextInt(e - s); // 随机生成RGB颜色中的g值
         int b = s + random.nextInt(e - s); // 随机生成RGB颜色中的b值
         return new Color(r, g, b);
     }
  
     public void service(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.setHeader("Pragma", "No-cache");
         response.setHeader("Cache-Control", "No-cache");
         response.setDateHeader("Expires", 0);
         // 指定生成的响应是图片
         response.setContentType("image/jpeg");
         int width = 86;
         int height = 22;
         BufferedImage image = new BufferedImage(width, height,
                 BufferedImage.TYPE_INT_RGB);
         Graphics g = image.getGraphics();
         Graphics2D g2d = (Graphics2D) g;
         Random random = new Random();
         Font mFont = new Font("黑体", Font.BOLD, 17);
         g.setColor(getRandColor(200, 250));
         g.fillRect(0, 0, width, height);
         g.setFont(mFont);
         g.setColor(getRandColor(180, 200));
         // 画随机的线条
         for (int i = 0; i < 100 ; i++) {
             int x = random .nextInt(width - 1);
             int y = random .nextInt(height - 1);
             int x1 = random .nextInt(6) + 1;
             int y1 = random .nextInt(12) + 1;
             BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,
                     BasicStroke.JOIN_BEVEL);
             Line2D line = new Line2D.Double(x, y, x + x1, y + y1);
             g2d.setStroke(bs);
             g2d.draw(line);
         }
         String sRand = "" ;
         // 输出随机的验证文字
         String ctmp = "" ;
         int itmp = 0 ;
         for (int i = 0 ; i < 4; i++) {
             // random = new Random(new java.util.Date().getTime() + i);
             switch (random.nextInt(4)) {
             case 1:
                 itmp = random .nextInt(26) + 65; // 生成A~Z的字母
                 ctmp = String .valueOf((char) itmp);
                 break;
             case 2: // 生成汉字
                 String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
                         "9", "a", "b", "c", "d", "e", "f" };
                 // 生成第1位的区码
                 int r1 = random .nextInt(3) + 11; // 生成11到14之间的随机数
                 String str_r1 = rBase [r1];
                 // 生成第2位的区码
                 int r2;
                 if (r1 == 13) {
                     r2 = random .nextInt(7); // 生成0到7之间的随机数
                 } else {
                     r2 = random .nextInt(16); // 生成0到16之间的随机数
                 }
                 String str_r2 = rBase [r2];
                 // 生成第1位的位码
                 int r3 = random .nextInt(6) + 10; // 生成10到16之间的随机数
                 String str_r3 = rBase [r3];
                 // 生成第2位的位码
                 int r4;
                 if (r3 == 10) {
                     r4 = random .nextInt(15) + 1; // 生成1到16之间的随机数
                 } else if (r3 == 15) {
                     r4 = random .nextInt(15); // 生成0到15之间的随机数
                 } else {
                     r4 = random .nextInt(16); // 生成0到16之间的随机数
                 }
                 String str_r4 = rBase [r4];
                 System.out.println(str_r1 + str_r2 + str_r3 + str_r4);
                 // 将生成机内码转换为汉字
                 byte[] bytes = new byte[2];
                 // 将生成的区码保存到字节数组的第1个元素中
                 String str_r12 = str_r1 + str_r2;
                 int tempLow = Integer .parseInt(str_r12, 16);
                 bytes[0] = (byte) tempLow;
                 // 将生成的位码保存到字节数组的第2个元素中
                 String str_r34 = str_r3 + str_r4;
                 int tempHigh = Integer .parseInt(str_r34, 16);
                 bytes[1] = (byte) tempHigh;
  
                 ctmp = new String(bytes); // 根据字节数组生成汉字
                 // System.out.println("生成汉字:" + ctmp);
                 break;
             default:
                 itmp = random .nextInt(10) + 48; // 生成0~9的数字
                 ctmp = String .valueOf((char) itmp);
                 break;
             }
             sRand += ctmp;
             Color color = new Color(20 + random.nextInt(110), 20 + random
                     .nextInt(110), 20 + random.nextInt(110));
             g.setColor(color);
             /** **随机缩放文字并将文字旋转指定角度* */
             // 将文字旋转指定角度
             Graphics2D g2d_word = (Graphics2D) g;
             AffineTransform trans = new AffineTransform();
             trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);
             // 缩放文字
             float scaleSize = random .nextFloat() + 0.8f;
             if (scaleSize > 1f)
                 scaleSize = 1f;
             trans.scale(scaleSize, scaleSize);
             g2d_word.setTransform(trans);
             /** ********************* */
             g.drawString(ctmp, 15 * i + 18, 14);
  
         }
         // 将生成的验证码保存到Session中
         HttpSession session = request.getSession(true);
         session.setAttribute("randCheckCode", sRand);
         g.dispose();
         ImageIO.write(image, "JPEG", response.getOutputStream());
     }
  
}

下面的例子是用Servlet生成的一个验证码,例子是模拟登陆。

login.jsp

  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  7. <title>验证码</title>  
  8. </head>  
  9. <body>  
  10.     <form action="${pageContext.request.contextPath }/servlet/LoginServlet">  
  11.     <table border="0" cellspacing="0" cellpadding="0" width="50%">  
  12.         <tr>  
  13.             <td width="20%" align="right">用户名:</td><td colspan="2"><input type="text" name="username" value="" size="34"/></td>  
  14.         </tr>  
  15.         <tr>  
  16.             <td width="20%" align="right">密 码:</td><td colspan="2"><input type="password" name="password" value="" size="35"/></td>  
  17.         </tr>  
  18.         <tr>  
  19.             <td width="20%" align="right">验证码:</td><td width="21%"><input type="text" name="code" value="" size="15"/></td><td align="left"><img src="${pageContext.request.contextPath }/servlet/ImageCodeMakerServlet" width="100px" height="30" /></td>  
  20.         </tr>  
  21.     </table>  
  22.     </form>  
  23. </body>  
  24. </html>  

在web.xml中

  1. <servlet>  
  2.     <servlet-name>login</servlet-name>  
  3.     <servlet-class>com.web.LoginServlet</servlet-class>  
  4.   </servlet>  
  5.   <servlet>  
  6.     <servlet-name>imageCodeMakerServlet</servlet-name>  
  7.     <servlet-class>com.web.ImageCodeMakerServlet</servlet-class>  
  8.   </servlet>  
  9.   <servlet-mapping>  
  10.     <servlet-name>login</servlet-name>  
  11.     <url-pattern>/servlet/LoginServlet</url-pattern>  
  12.   </servlet-mapping>  
  13.   <servlet-mapping>  
  14.     <servlet-name>imageCodeMakerServlet</servlet-name>  
  15.     <url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>  
  16.   </servlet-mapping>  
<servlet>
  	<servlet-name>login</servlet-name>
  	<servlet-class>com.web.LoginServlet</servlet-class>
  </servlet>
  <servlet>
  	<servlet-name>imageCodeMakerServlet</servlet-name>
  	<servlet-class>com.web.ImageCodeMakerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>login</servlet-name>
  	<url-pattern>/servlet/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
	<servlet-name>imageCodeMakerServlet</servlet-name>
	<url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>
  </servlet-mapping>


在后台Servlet里
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import javax.servlet.http.HttpSession;  
  8.   
  9. public class LoginServlet extends HttpServlet{  
  10.   
  11.     @Override  
  12.     protected void service(HttpServletRequest request, HttpServletResponse response)  
  13.             throws ServletException, IOException {  
  14.         String username = request.getParameter("username");  
  15.         String password = request.getParameter("password");  
  16.         String code = request.getParameter("code");// 页面,用户输入的验证码   
  17.           
  18.         HttpSession session = request.getSession();  
  19.         String randCode = (String)session.getAttribute("randCode");// 得到系统生成的验证码   
  20.           
  21.         if(randCode.equals(code)){// 验证码输入正确   
  22.             System.out.println("验证码输入正确");  
  23.         }else{  
  24.             System.out.println("验证码不正确");  
  25.         }  
  26.     }  
  27. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值