Java 验证码

来源:互联网 发布:oracle sql是什么 编辑:程序博客网 时间:2024/06/13 01:22


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

login.jsp

[html] view plaincopy
  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中

[html] view plaincopy
  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里

[java] view plaincopy
  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. }  


ImageCodeMakerServlet如下

[java] view plaincopy
  1. import java.awt.Color;  
  2. import java.awt.Font;  
  3. import java.awt.Graphics;  
  4. import java.awt.image.BufferedImage;  
  5. import java.io.IOException;  
  6. import java.util.Random;  
  7.   
  8. import javax.imageio.ImageIO;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class ImageCodeMakerServlet extends HttpServlet {  
  15.   
  16.     public ImageCodeMakerServlet() {  
  17.         super();  
  18.     }  
  19.   
  20.     public void destroy() {  
  21.         super.destroy();   
  22.     }  
  23.   
  24.     public void service(HttpServletRequest request, HttpServletResponse response)  
  25.             throws ServletException, IOException {  
  26.   
  27.         // 首先设置页面不缓存  
  28.         response.setHeader("Pragma""No-cache");  
  29.         response.setHeader("Cache-Control""no-cache");  
  30.         response.setDateHeader("Expires"0);  
  31.   
  32.         // 定义图片的宽度和高度  
  33.         int width = 90, height = 40;  
  34.         // 创建一个图像对象  
  35.         BufferedImage image = new BufferedImage(width, height,  
  36.                 BufferedImage.TYPE_INT_RGB);  
  37.         // 得到图像的环境对象  
  38.         Graphics g = image.createGraphics();  
  39.   
  40.         Random random = new Random();  
  41.         // 用随机颜色填充图像背景  
  42.         g.setColor(getRandColor(180250));  
  43.         g.fillRect(00, width, height);  
  44.         for (int i = 0; i < 5; i++) {  
  45.             g.setColor(getRandColor(50100));  
  46.             int x = random.nextInt(width);  
  47.             int y = random.nextInt(height);  
  48.             g.drawOval(x, y, 44);  
  49.         }  
  50.         // 设置字体,下面准备画随机数  
  51.         g.setFont(new Font("", Font.PLAIN, 40));  
  52.         // 随机数字符串  
  53.         String sRand = "";  
  54.         for (int i = 0; i < 4; i++) {  
  55.             // 生成四个数字字符  
  56.             String rand = String.valueOf(random.nextInt(10));  
  57.             sRand += rand;  
  58.             // 生成随机颜色  
  59.             g.setColor(new Color(20 + random.nextInt(80), 20 + random  
  60.                     .nextInt(100), 20 + random.nextInt(90)));  
  61.             // 将随机数字画在图像上  
  62.             g.drawString(rand, (17 + random.nextInt(3)) * i + 834);  
  63.   
  64.             // 生成干扰线  
  65.             for (int k = 0; k < 12; k++) {  
  66.                 int x = random.nextInt(width);  
  67.                 int y = random.nextInt(height);  
  68.                 int xl = random.nextInt(9);  
  69.                 int yl = random.nextInt(9);  
  70.                 g.drawLine(x, y, x + xl, y + yl);  
  71.             }  
  72.         }  
  73.   
  74.         // 将生成的随机数字字符串写入Session  
  75.         request.getSession(false).setAttribute("randcode", sRand);  
  76.         // 使图像生效  
  77.         g.dispose();  
  78.         // 输出图像到页面  
  79.         ImageIO.write(image, "JPEG", response.getOutputStream());  
  80.     }  
  81.   
  82.     /** 
  83.      * Initialization of the servlet. <br> 
  84.      *  
  85.      * @throws ServletException 
  86.      *             if an error occurs 
  87.      */  
  88.     public void init() throws ServletException {  
  89.         // Put your code here  
  90.     }  
  91.     /** 
  92.      * 产生一个随机的颜色 
  93.      *  
  94.      * @param fc 
  95.      *            颜色分量最小值 
  96.      * @param bc 
  97.      *            颜色分量最大值 
  98.      * @return 
  99.      */  
  100.     public Color getRandColor(int fc, int bc) {  
  101.         Random random = new Random();  
  102.         if (fc > 255){  
  103.             fc = 255;  
  104.         }  
  105.         if (bc > 255){  
  106.             bc = 255;  
  107.         }  
  108.         int r = fc + random.nextInt(bc - fc);  
  109.         int g = fc + random.nextInt(bc - fc);  
  110.         int b = fc + random.nextInt(bc - fc);  
  111.         return new Color(r, g, b);  
  112.     }  
  113.   

原创粉丝点击