利用servlet技术实现验证码功能

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>  
 2   
 3 <%  
 4     String action = request.getParameter("action");  
 5     String safecodeText = request.getParameter("safecodeTest");  
 6     if("action".equals(action)){  
 7         String safecode = (String)session.getAttribute("safecode");  
 8         if(safecode.equals(safecodeText)){  
 9             out.print("验证码正确!");  
10         }else{  
11             out.print("验证码错误!请重新输入!");  
12         }  
13     }  
14 %>  
15 <html>  
16   <head>  
17     <title>验证码测试</title>  
18   </head>  
19     
20   <body>  
21     <form action="servlet/demo" method="post">  
22     <input type="hidden" name="action" value="action"/>  
23         <img alt="验证码" src="servlet/demo">  
24         <input type="text" name="safecodeTest">  
25         <input type="submit" value="go">  
26     </form>  
27   </body>  
28 </html> 
 1 import java.io.*;  
 2   
 3 import javax.servlet.*;  
 4 import javax.servlet.http.*;  
 5 import java.util.Random;  
 6 import java.awt.*;  
 7 import java.awt.image.*;  
 8 import javax.imageio.*;  
 9 
10   
11 public class demo extends HttpServlet {  
12     //产生随即的字体  
13     private Font getFont() {  
14         Random random = new Random();  
15         Font font[] = new Font[5];  
16         font[0] = new Font("Ravie", Font.PLAIN, 24);  
17         font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);  
18         font[2] = new Font("Forte", Font.PLAIN, 24);  
19         font[3] = new Font("Wide Latin", Font.PLAIN, 24);  
20         font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);  
21         return font[random.nextInt(5)];  
22     }  
23   
24     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
25             throws ServletException, IOException {  
26         // 设置响应头 Content-type类型  
27         resp.setContentType("image/jpeg");  
28         // 以下三句是用于设置页面不缓存  
29         resp.setHeader("Pragma", "No-cache");  
30         resp.setHeader("Cache-Control", "No-cache");  
31         resp.setDateHeader("Expires", 0);  
32   
33         OutputStream os = resp.getOutputStream();  
34         int width = 83, height = 30;  
35         // 建立指定宽、高和BufferedImage对象  
36         BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  
37   
38         Graphics g = image.getGraphics(); // 该画笔画在image上  
39         Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场  
40         g.fillRect(0, 0, width, height);  
41           
42   
43         char[] ch = "abcdefghjkmnpqrstuvwxyz23456789".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0)  
44         int length = ch.length; // 随即字符串的长度  
45         String sRand = ""; // 保存随即产生的字符串  
46         Random random = new Random();  
47         for (int i = 0; i < 4; i++) {  
48             // 设置字体  
49             g.setFont(getFont());  
50             // 随即生成0-9的数字  
51             String rand = new Character(ch[random.nextInt(length)]).toString();  
52             sRand += rand;  
53             // 设置随机颜色  
54             g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));  
55             g.drawString(rand, 20 * i + 6, 25);  
56         }  
57         //产生随即干扰点  
58         for (int i = 0; i < 20; i++) {  
59             int x1 = random.nextInt(width);  
60             int y1 = random.nextInt(height);  
61             g.drawOval(x1, y1, 2, 2);  
62         }  
63         g.setColor(c); // 将画笔的颜色再设置回去  
64         g.dispose();  
65   
66         //将验证码记录到session  
67         req.getSession().setAttribute("safecode", sRand);  
68         // 输出图像到页面  
69         ImageIO.write(image, "JPEG", os);  
70   
71     }  
72   
73     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
74             throws ServletException, IOException {  
75         doGet(req, resp);  
76     }  
77   
78 }  
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3   <display-name>JavaWebDemo</display-name>
 4   <servlet>
 5     <description>This is the description of my J2EE component</description>
 6     <display-name>This is the display name of my J2EE component</display-name>
 7     <servlet-name>demo</servlet-name>
 8     <servlet-class>demo</servlet-class>
 9   </servlet>
10 
11   <servlet-mapping>
12     <servlet-name>demo</servlet-name>
13     <url-pattern>/servlet/demo</url-pattern>
14   </servlet-mapping>
15  
16   <welcome-file-list>
17     <welcome-file>index.html</welcome-file>
18     <welcome-file>index.htm</welcome-file>
19     <welcome-file>index.jsp</welcome-file>
20     <welcome-file>default.html</welcome-file>
21     <welcome-file>default.htm</welcome-file>
22     <welcome-file>default.jsp</welcome-file>
23   </welcome-file-list>
24 </web-app>
 1 package action;
 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.ByteArrayInputStream;
 8 import java.io.ByteArrayOutputStream;
 9 import java.util.Map;
10 
11 import javax.imageio.ImageIO;
12 import javax.imageio.stream.ImageOutputStream;
13 
14 import com.opensymphony.xwork2.ActionContext;
15 import com.opensymphony.xwork2.ActionSupport;
16 
17 public class ImageAction extends ActionSupport {
18 
19     /**
20      * 
21      */
22     private static final long serialVersionUID = 1L;
23     private ByteArrayInputStream inputStream;
24     public String createRandomString(){
25         String str="";
26         for(int i=0;i<4;i++){
27             str+=Integer.toString((new Double(Math.random()*10)).intValue());
28         }
29         return str;
30     }
31     public Color createRandomColor(){
32         int r=(new Double(Math.random()*256)).intValue();
33         int g=(new Double(Math.random()*256)).intValue();
34         int b=(new Double(Math.random()*256)).intValue();
35         return new Color(r,g,b);
36     }
37     public BufferedImage createImage(String str){
38         int width=60;
39         int height=22;
40         BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
41         Graphics g=image.getGraphics();
42         g.setColor(Color.WHITE);
43         g.fillRect(0, 0, width, height);
44         g.setColor(Color.BLACK);
45         g.drawRect(0, 0, width-1, height-1);
46         g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
47         g.setColor(this.createRandomColor());
48         g.drawString(Character.toString(str.charAt(0)), 8, 17);
49         g.drawString(Character.toString(str.charAt(1)), 20, 17);
50         g.drawString(Character.toString(str.charAt(2)), 33, 17);
51         g.drawString(Character.toString(str.charAt(3)), 45, 17);
52         g.dispose();
53         return image;
54     }
55     public ByteArrayInputStream createInputStream() throws Exception{
56         String str=this.createRandomString();
57         BufferedImage image=this.createImage(str);
58         ActionContext actioncontext=ActionContext.getContext();
59         Map session=actioncontext.getSession();
60         session.put("random", str);
61         ByteArrayOutputStream output=new ByteArrayOutputStream();
62         ImageOutputStream imageout=ImageIO.createImageOutputStream(output);
63         ImageIO.write(image, "JPEG", imageout);
64         imageout.close();
65         ByteArrayInputStream input=new ByteArrayInputStream(output.toByteArray());
66         output.close();
67         return input;      
68     }
69     public String execute() throws Exception{
70         setInputStream(createInputStream());
71         return SUCCESS;
72     }
73     public ByteArrayInputStream getInputStream(){
74         return inputStream;
75     }
76     public void setInputStream(ByteArrayInputStream inputStream){
77         this.inputStream=inputStream;
78     }
79 }
原文地址:https://www.cnblogs.com/rain-tl/p/4855020.html