zoukankan      html  css  js  c++  java
  • 验证码

    验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字、字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的。好了废话不多说一起往下看:

     
     
    简单的登录页面(代码并不完整,只有验证码部分)
     
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    3. <html>  
    4.   <head>  
    5.     <title>验证码</title>  
    6.     <script type="text/javascript">  
    7. <span style="white-space:pre"></span><span style="white-space:pre"</span> //刷新验证码的js函数    
    8. <span style="white-space:pre">  </span>function changeCode() {    
    9. <span style="white-space:pre">      </span>var imgNode = document.getElementById("vimg");                    
    10.   
    11. <span style="white-space:pre">      </span>//重新加载验证码,达到刷新的目的    
    12. <span style="white-space:pre">      </span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random();  // 防止浏览器缓存的问题       
    13. <span style="white-space:pre">  </span>}      
    14.     </script>  
    15.   </head>  
    16.   <body>  
    17.     <form action="checkServlet" method="post">  
    18.         <label>输入验证码</label><br/>  
    19.         <input type="text" name="randomCode"/><img id="vimg"  title="点击更换" onclick="changeCode();" src="servlet/AuthImageServlet"><br/>  
    20.         <input type="submit" value="submit">  
    21.     </form>  
    22.   </body>  
    23. </html>  
    通过session.getAttribute("rand"),获得生成的验证码,然后跟用户输入的进行比较,再根据比较结果做相应的处理。

    通过servlet生成验证码:

     
    1. package com.util.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.util.Random;  
    9.   
    10. import javax.imageio.ImageIO;  
    11. import javax.servlet.ServletException;  
    12. import javax.servlet.http.HttpServlet;  
    13. import javax.servlet.http.HttpServletRequest;  
    14. import javax.servlet.http.HttpServletResponse;  
    15. import javax.servlet.http.HttpSession;  
    16.   
    17. public class AuthImageServlet extends HttpServlet {  
    18.   
    19.     private static final String CONTENT_TYPE = "text/html; charset=gb2312";     
    20.     //设置字母的大小,大小     
    21.     private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);     
    22.     public void init() throws ServletException     
    23.     {     
    24.         super.init();     
    25.     }     
    26.     Color getRandColor(int fc,int bc)     
    27.     {     
    28.         Random random = new Random();     
    29.         if(fc>255) fc=255;     
    30.         if(bc>255) bc=255;     
    31.         int r=fc+random.nextInt(bc-fc);     
    32.         int g=fc+random.nextInt(bc-fc);     
    33.         int b=fc+random.nextInt(bc-fc);     
    34.         return new Color(r,g,b);     
    35.     }     
    36.     
    37.     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException     
    38.     {     
    39.         response.setHeader("Pragma","No-cache");     
    40.         response.setHeader("Cache-Control","no-cache");     
    41.         response.setDateHeader("Expires", 0);     
    42.         //表明生成的响应是图片     
    43.         response.setContentType("image/jpeg");     
    44.              
    45.         int width=100, height=18;     
    46.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);     
    47.              
    48.         Graphics g = image.getGraphics();     
    49.         Random random = new Random();     
    50.         g.setColor(getRandColor(200,250));     
    51.         g.fillRect(1, 1, width-1, height-1);     
    52.         g.setColor(new Color(102,102,102));     
    53.         g.drawRect(0, 0, width-1, height-1);     
    54.         g.setFont(mFont);     
    55.     
    56.         g.setColor(getRandColor(160,200));     
    57.     
    58.         //画随机线     
    59.         for (int i=0;i<155;i++)     
    60.         {     
    61.             int x = random.nextInt(width - 1);     
    62.             int y = random.nextInt(height - 1);     
    63.             int xl = random.nextInt(6) + 1;     
    64.             int yl = random.nextInt(12) + 1;     
    65.             g.drawLine(x,y,x + xl,y + yl);     
    66.         }     
    67.     
    68.         //从另一方向画随机线     
    69.         for (int i = 0;i < 70;i++)     
    70.         {     
    71.             int x = random.nextInt(width - 1);     
    72.             int y = random.nextInt(height - 1);     
    73.             int xl = random.nextInt(12) + 1;     
    74.             int yl = random.nextInt(6) + 1;     
    75.             g.drawLine(x,y,x - xl,y - yl);     
    76.         }     
    77.     
    78.         //生成随机数,并将随机数字转换为字母     
    79.         String sRand="";     
    80.         for (int i=0;i<6;i++)     
    81.         {     
    82.             int itmp = random.nextInt(26) + 65;     
    83.             char ctmp = (char)itmp;     
    84.             sRand += String.valueOf(ctmp);     
    85.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));     
    86.             g.drawString(String.valueOf(ctmp),15*i+10,16);     
    87.         }     
    88.     
    89.         HttpSession session = request.getSession(true);     
    90.         session.setAttribute("rand",sRand);     
    91.         g.dispose();     
    92.         ImageIO.write(image, "JPEG", response.getOutputStream());     
    93.     }     
    94.     
    95. }  



    web.xml中的servlet配置信息:

     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.       
    8.   <servlet>  
    9.     <servlet-name>AuthImageServlet</servlet-name>  
    10.     <servlet-class>com.util.servlet.AuthImageServlet</servlet-class>  
    11.   </servlet>  
    12.   <servlet-mapping>  
    13.     <servlet-name>AuthImageServlet</servlet-name>  
    14.     <url-pattern>/servlet/AuthImageServlet</url-pattern>  
    15.   </servlet-mapping>  
    16.     
    17.   <welcome-file-list>  
    18.     <welcome-file>index.jsp</welcome-file>  
    19.   </welcome-file-list>  
    20. </web-app>  


    就这样验证码的功能就实现了,很简单、很实用。当然还有更加美观,更加严密的方式,有兴趣的朋友可以深入研究。这里就跟大家分享一个比较简单的方式。欢迎各位批评指正。

    每天学习一点点,你就进步一点点。
  • 相关阅读:
    数据类型
    python安装
    计算机基础
    Ajax--1
    ASP.net+MVC--2
    More lumber is required
    History Grading
    strcmp() Anyone?
    How Many Points of Intersection?
    Remember the Word
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/5331287.html
Copyright © 2011-2022 走看看