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;
                }
    }
  • 相关阅读:
    基础实验7-2.2 插入排序还是堆排序 (25分)
    进阶实验6-3.1 红色警报 (25分)--并查集
    基础实验3-2.2 单链表分段逆转 (25分)--单链表
    基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵
    案例6-1.3 哥尼斯堡的“七桥问题” (25分)--dfs图连通+度判断
    基础实验8-1.1 单身狗 (25分)
    基础实验7-2.3 德才论 (25分)--排序
    基础实验7-2.4 PAT排名汇总 (25分)--结构体排序(快排)
    进阶实验4-3.4 笛卡尔树 (25分)--二叉排序树+堆排序
    基础实验4-2.7 修理牧场 (25分)-堆+哈夫曼树
  • 原文地址:https://www.cnblogs.com/zhangchunxi/p/2961007.html
Copyright © 2011-2022 走看看