欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java EE 生成网站表单的验证码

程序员文章站 2022-05-10 10:43:07
如今绝大多数的网站或者Web应用程序都实现了验证码功能,加入验证码可以防止黑客利用恶意程序,在网站中进行频繁登录,注册和灌水等操作。 下面的例子主要用到Java EE中Jsp、Servlet技术,希望能为初学者提供帮助。 步骤如下: 1、先在MyEclipse下创建一个web project,项目目 ......

如今绝大多数的网站或者Web应用程序都实现了验证码功能,加入验证码可以防止黑客利用恶意程序,在网站中进行频繁登录,注册和灌水等操作。

下面的例子主要用到Java EE中Jsp、Servlet技术,希望能为初学者提供帮助。

步骤如下:

1、先在MyEclipse下创建一个web project,项目目录结构如下图:

Java EE 生成网站表单的验证码

 

2、在src目录下创建包名为com.servlet的包,然后在包内创建Servlet类,名为:ValidateCodeServlet,该类的作用就是实现生成验证码图片。  

  代码及注释如下:ValidateCodeServlet.java

Java EE 生成网站表单的验证码
 1 package com.servlet;
 2 
 3 import java.awt.Color;
 4 import java.awt.Font;
 5 import java.awt.Graphics;
 6 import java.awt.image.BufferedImage;
 7 import java.io.IOException;
 8 import java.io.PrintWriter;
 9 import java.util.Random;
10 
11 import javax.imageio.ImageIO;
12 import javax.servlet.ServletException;
13 import javax.servlet.http.HttpServlet;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
16 
17 public class ValidateCodeServlet extends HttpServlet {
18 
19 
20     public void doGet(HttpServletRequest request, HttpServletResponse response)
21             throws ServletException, IOException {
22         doPost(request,response);
23         
24     }
25 
26 
27     public void doPost(HttpServletRequest request, HttpServletResponse response)
28             throws ServletException, IOException {
29         //禁止页面缓存
30         response.setHeader("Pragma", "No-cache");
31         response.setHeader("Cache-Control", "No-cache");
32         response.setDateHeader("Expires", 0);
33         response.setContentType("image/jpeg");  //设置响应正文的MIME类型为图片
34         
35         int width=60,height=20;
36         //创建一个位于缓存中的图像,宽度为60,高度为20
37         BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
38         //获取用于处理图形上下文的对象,相当于画笔
39         Graphics g=image.getGraphics();
40         Random random=new Random();   //随机数对象
41         g.setColor(getRandomColor(200,250));  //设置图像的背景色
42         g.fillRect(0, 0, width, height);  //画一个矩形,坐标为(0,0),宽度为60,高度为20
43         g.setFont(new Font("Times New Roman",Font.PLAIN,18));   //设置字体格式
44         g.setColor(getRandomColor(160,200)); 
45         for(int i=0;i<130;i++){   //产生130条干扰线
46             int x =random.nextInt(width);
47             int y =random.nextInt(height);
48             int x1 =random.nextInt(12);   //nextInt(12) 代表0到12的int类型随机数
49             int y1 =random.nextInt(12);
50             g.drawLine(x, y, x+x1, y+y1);  //在图像的坐标(x,y)和坐标(x+x1,y+y1)之间画干扰线
51         }
52         String strCode="";
53         for(int i=0;i<4;i++){
54             String strNumber=String.valueOf(random.nextInt(10));
55             strCode=strCode+strNumber;
56             //设置字体颜色
57             g.setColor(new Color(15+random.nextInt(120),15+random.nextInt(120),15+random.nextInt(120)));
58             g.drawString(strNumber, 13*i+6, 16);   //将验证码依次画在图像上,坐标为(13*i+6,16)
59         }
60         request.getSession().setAttribute("Code", strCode);  //将验证码保持到ssesion中
61         g.dispose();  //释放此图像的上下文以及它使用的所以系统资源
62         ImageIO.write(image, "JPEG", response.getOutputStream()); //输出JPEG格式的图像
63         response.getOutputStream().flush();  //刷新输出流
64         response.getOutputStream().close();  //关闭输出流
65 
66     }
67     
68     //获取随机颜色的方法
69     public Color getRandomColor(int fc,int bc){
70         Random random=new Random();
71         Color randomcolor=null;
72         if(fc>255)
73             fc=255;
74         if(bc>255)
75             bc=255;
76         //设置0-255之间的随机颜色值
77         int r=fc+random.nextInt(bc-fc);
78         int g=fc+random.nextInt(bc-fc);
79         int b=fc+random.nextInt(bc-fc);
80         randomcolor=new Color(r,g,b);
81         return randomcolor;   //返回具有红蓝绿的不透明的sRGB的颜色
82     }
83     
84     
85 
86 }
ValidateCodeServlet.java

 

3、新建表单注册页面index.jsp,在该页的表单中使用<img>标签的src属性来调用ValidateCodeServlet类生成的图片验证码。

  代码如下:

Java EE 生成网站表单的验证码
 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>验证码例子</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18   </head>
19   
20   <body>
21     <form action="" method="post">
22         <table align="center">
23             <tr>
24                 <td>用户名:</td>
25                 <td><input type="text" name="name"></td>
26             </tr>
27             <tr>
28                 <td>密码:</td>
29                 <td><input type="password" name="name"></td>
30             </tr>
31             <tr>
32                 <td>验证码:</td>
33                 <td><img alt="" src="ValidateCodeServlet" /></td>
34             </tr>
35             <tr>
36                 <td>请输入验证码:</td>
37                 <td><input type="text" name="code"></td>
38             </tr>
39         </table>
40     </form>
41   </body>
42 </html>
index.jsp

 

运行效果如下:

Java EE 生成网站表单的验证码