继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java实现Web页面前数字字母验证码实现

holdtom
关注TA
已关注
手记 1853
粉丝 240
获赞 991


最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来,

前段页面实现代码:

<ul>

   <li><label>验证码:</label></li>

   <li>

    <div>

    <input  type="text" name="validateCode"  class="login_input" value=""/>

    <img  id="img" src="${baseURL }/validateCode" ="ValidateCode(this);" />

    </div>

    </li>

</ul>

为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式。

页面JS代码:触发变动验证码改变的JS

<script type="text/javascript" language="javascript">

   

   //请求获取验证码

   function ValidateCode(obj){

     $(obj).attr("src","${baseURL }/validateCode?"+new Date().getTime());

   }

</script>

后台 Controller处理:

package com.njcc.pay.controller.login;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.math.NumberUtils;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.dubbo.common.utils.StringUtils;

/**

 * 验证马  Controller

 * 

 * @author Administrator

 *

 */

@Controller

public class ValidateCodeController {

  

  @SuppressWarnings("unused")

  private static final Log LOG = LogFactory.getLog(ValidateCodeController.class);

  

    public static final String VALIDATE_CODE = "validateCode";

  private int w = 70;

  private int h = 23;

  

  /**

   * @throws Exception 

   * 函数功能说明 : 进入后台登陆页面.

   * 

   * @参数: @return

   * @return String

   * @throws

   */

  @RequestMapping(value = "/validateCode")

  public void validateCode(HttpServletRequest request,

      HttpServletResponse response) throws Exception {

    createImage(request,response);

  }

  

  

  private void createImage(HttpServletRequest request,HttpServletResponse response) throws IOException {

    response.setHeader("Pragma", "no-cache");

    response.setHeader("Cache-Control", "no-cache");

    response.setDateHeader("Expires", 0);

    response.setContentType("image/jpeg");

    String width = request.getParameter("width");

    String height = request.getParameter("height");

    if (StringUtils.isNumeric(width) && StringUtils.isNumeric(height)) {

      w = NumberUtils.toInt(width);

      h = NumberUtils.toInt(height);

    }

    

    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

    Graphics g = image.getGraphics();

    /*

     * 生成背景

     */

    createBackground(g);

    /*

     * 生成字符

     */

    String s = createCharacter(g);

    request.getSession().setAttribute(VALIDATE_CODE, s);

    g.dispose();

    OutputStream out = response.getOutputStream();

    ImageIO.write(image, "JPEG", out);

    out.close();

  }

  /**

   * 生成颜色

   * @param fc

   * @param bc

   * @return

   */

  private Color getRandColor(int fc,int bc) { 

    int f = fc;

    int b = bc;

    Random random=new Random();

        if(f>255) {

          f=255; 

        }

        if(b>255) {

          b=255; 

        }

        return new Color(f+random.nextInt(b-f),f+random.nextInt(b-f),f+random.nextInt(b-f)); 

  }

  

  /**

   * 生成背景

   * @param g

   */

  private void createBackground(Graphics g) {

    // 填充背景

    g.setColor(getRandColor(220,250)); 

    g.fillRect(0, 0, w, h);

    // 加入干扰线条

    for (int i = 0; i < 8; i++) {

      g.setColor(getRandColor(40,150));

      Random random = new Random();

      int x = random.nextInt(w);

      int y = random.nextInt(h);

      int x1 = random.nextInt(w);

      int y1 = random.nextInt(h);

      g.drawLine(x, y, x1, y1);

    }

  }

  /**

   * 生成字符

   * @param g

   * @return

   */

  private String createCharacter(Graphics g) {

    char[] codeSeq = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',

        'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',

        'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };

    String[] fontTypes = {"Arial","Arial Black","AvantGarde Bk BT","Calibri"}; 

    Random random = new Random();

    StringBuilder s = new StringBuilder();

    for (int i = 0; i < 4; i++) {

      String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);//random.nextInt(10));

      g.setColor(new Color(50 + random.nextInt(100), 50 + random.nextInt(100), 50 + random.nextInt(100)));

      g.setFont(new Font(fontTypes[random.nextInt(fontTypes.length)],Font.BOLD,26)); 

      g.drawString(r, 15 * i + 5, 19 + random.nextInt(8));

//      g.drawString(r, i*w/4, h-5);

      s.append(r);

    }

    return s.toString();

  }

  

  

  

  

}

©著作权归作者所有:来自51CTO博客作者猿猴技术男的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP