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

    首先,创建生成验证码类:

    //需要导入的包
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.imageio.stream.ImageOutputStream;
    

    //生成具有背景图像的验证码类

    public class IdentifyCode {

     private String randCode;
     private ByteArrayInputStream  inputStream;
     //参数:随机码个数
     public IdentifyingCode( int codeNum ) {
      try {
       createRandCode ( codeNum ) ;
      } catch (Exception e) {
       e.printStackTrace();
      }

    public String getRandCode() {
      return randCode;
     }

     public ByteArrayInputStream getInputStream() {
      return inputStream;
     } 


     }

    定义createRandCode方法:

    private  void createRandCode (int codeNum ) throws Exception{
          //在内存中创建图象  
          int width = 15*codeNum;
    int height = 25; //创建一个不带透明色的BufferedImage对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取图形上下文 Graphics g = image.getGraphics(); //生成随机类 Random random = new Random(); //设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); //设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 20)); //随机产生1000条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160, 200));  //获取随机颜色

    for (int i = 0; i < 1000; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(14); int yl = random.nextInt(14); g.drawLine(x, y, x + xl, y + yl); } //定义数字数组 int[] number = {56,57,58,59,60,61,62,63,64,65}; //定义小写字母数组 int[] lowerAlphabet = {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}; //定义大字母数组 int[] upperAlphabet = {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}; //取随机产生的认证码(codeNum位数字) StringBuilder sRand = new StringBuilder(); for (int i = 0; i < codeNum; i++) { char rand; int nowNum = random.nextInt(3); nowNum=0; switch (nowNum) { case 0: { rand = (char) number[random.nextInt(number.length)]; break; } case 1: { rand = (char) lowerAlphabet[random.nextInt(lowerAlphabet.length)]; break; } case 2: { rand = (char) upperAlphabet[random.nextInt(upperAlphabet.length)]; break; } default: { rand =(char) lowerAlphabet[random.nextInt(lowerAlphabet.length)]; break; } } sRand.append(rand); // 将认证码显示到图象中 g.setColor(new Color(10 + random.nextInt(110), 10 + random.nextInt(110), 10 + random.nextInt(110))); g.drawString(rand+"", 13 * i + 7, 18); } g.dispose(); this.randCode=sRand.toString(); ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(image, "JPEG", imageOut); this.inputStream = new ByteArrayInputStream(output.toByteArray()); imageOut.close(); output.close(); }
     /* 
      * 给定范围获得随机颜色 
      */
     
    private  Color getRandColor(int fc, int bc) {
      
    Random random = new Random();
      
    if (fc > 255)
       fc = 255;
      
    if (bc > 255)
       bc = 255;
      
    int r = fc + random.nextInt(bc - fc);
      
    int g = fc + random.nextInt(bc - fc);
      
    int b = fc + random.nextInt(bc - fc);
      
    return new Color(r, g, b);
     
    }



    前台页面处理:

    <!--加载页面的同时加载随机码-->
    <
    body onload="loadRandCode()">
    <form id="login" name="login" method="post">
    <table>
    <tr>
          
    <td height="27" colspan="2" bordercolor="#666666">
           
    <span class="style8">验证码</span>

          </td>
          <td width="128" valign="bottom">

           <input type="text" name="randCode" id="randCode" class="input_css" tabindex="3" maxlength="4"  />
     
          </td>

          <td>

           <span class="STYLE6">&nbsp;<span class="style7"><img id ="randCodeImg"  onclick="changeValidateCode(this)"/></span></span>

          </td>

         </tr>

        </table>
    </form>
    </body>
    <script type="text/javascript">

      
    /**
       *获取图形验证码
       */

        function changeValidateCode(obj) {
      //获取当前的时间作为参数,无具体意义 

          var timenow = new Date().getTime();

     
         obj.src="${pageContext.request.contextPath}/Login_rand.do?d="+timenow;
     
           }

           //第一次加载   
           function loadRandCode(){

            changeValidateCode(document.getElementById("randCodeImg"))

           }

        /**
       *登录验证和请求
       */

         function userLogin(){
    var webForm = document.getElementById("login");

         webForm.action = "${pageContext.request.contextPath}/Login_login.do";

         webForm.submit();}


     
    </script>

    后台验证判断处理:

    public String login() {
        if(!randCode.equalsIgnoreCase((String)session.get("randCode"))){
                    request.setAttribute("error", "验证码输入错误!");
                    return INPUT;
                }
    }
  • 相关阅读:
    Java 简单算法--打印乘法口诀(只使用一次循环)
    Java简单算法--求100以内素数
    ubuntu 16.04 chrome flash player 过期
    java 网络API访问 web 站点
    java scoket (UDP通信模型)简易聊天室
    leetcode1105 Filling Bookcase Shelves
    leetcode1140 Stone Game II
    leetcode1186 Maximum Subarray Sum with One Deletion
    leetcode31 Next Permutation
    leetcode834 Sum of Distances in Tree
  • 原文地址:https://www.cnblogs.com/zhangchunxi/p/2961007.html
Copyright © 2011-2022 走看看