Java实现随机验证码具体代码

本文实例为大家分享了Java随机生成验证码的具体代码,供大家参考,具体内容如下

import java.awt.Color;

import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class RandImage extends HttpServlet {

/**
* Constructor of the object.
*/
  public RandImage() {
    super();
  }

    private int imgWidth = 0; //图片宽度

    private int imgHeight = 0; //图片的高度

    private int codeCount = 0; //图片里面字符的个数

    private int x = 0;

    private int fontHeight; //字体的高度
  
    private int codeY; 

    private String fontStyle; //字体样式

    //序列化ID 避免重复
    private static final long serialVersionUID = 128554012633034503L;

    /**
    * 初始化配置参数
    */

public void init() throws ServletException {

  // 宽度
  String strWidth = "200";
  // 高度
  String strHeight ="80";
  // 字符个数
  String strCodeCount ="5";
  //字体
  fontStyle = "Times New Roman";

// 将配置的信息转换成数值
  try {
    if (strWidth != null && strWidth.length() != 0) {
    imgWidth = Integer.parseInt(strWidth);
    }
  if (strHeight != null && strHeight.length() != 0) {
  imgHeight = Integer.parseInt(strHeight);
    }
  if (strCodeCount != null && strCodeCount.length() != 0) {
  codeCount = Integer.parseInt(strCodeCount);
    }
  } catch (NumberFormatException e) {
    e.printStackTrace();
  }
  
    x = imgWidth / (codeCount + 1); //字符间距
    fontHeight = imgHeight - 2; //字体的高度
    codeY = imgHeight - 12; // 代码高度
  }

    protected void processRequest(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {

    //输出流设置
    response.setContentType("image/jpeg"); //输出格式
    response.setHeader("Pragma", "No-cache");//不缓存 重新生成
    response.setHeader("Cache-Control", "no-cache");//不缓存 重新生成
    response.setDateHeader("Expires", 0); //0秒失效 也是不缓存
    HttpSession session = request.getSession(); //获取session 会话

    // 在内存中创建图象
    BufferedImage image = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
    // 获取图形上下文  
    Graphics2D g = image.createGraphics();
    // 生成随机类
    Random random = new Random(); //随机类
    // 设定矩形的背景色
    g.setColor(Color.WHITE);
    //填充矩形Rect为白色
    g.fillRect(0, 0, imgWidth, imgHeight);

    // 设定边框字体
    g.setFont(new Font(fontStyle, Font.PLAIN + Font.ITALIC, fontHeight));
    //设置边框的颜色
    g.setColor(new Color(55, 55, 12));
    // 画边框
    g.drawRect(0, 0, imgWidth - 1, imgHeight - 1);

    // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160, 200));
    for (int i = 0; i < 160; i++) {
    int x = random.nextInt(imgWidth);
    int y = random.nextInt(imgHeight);
    int xl = random.nextInt(12);
    int yl = random.nextInt(12);
    g.drawLine(x, y, x + xl, y + yl);
  }
  
    // 取随机产生的认证码(4位数字)
    String sRand = "";
    int red = 0, green = 0, blue = 0;
    for (int i = 0; i < codeCount; i++) { //循环生成codeCount个随机字符

    //通过rgb三色随机得到新的颜色
    red = random.nextInt(255);
    green = random.nextInt(255);
    blue = random.nextInt(255);
    //随机得到一个0 1 2 的数字
    int wordType = random.nextInt(3);//随机得到0-2之间的3个数字
    char retWord = 0;
    //0 数字 1 小写字母 2 大写字母
    switch (wordType) {
  case 0:
    retWord = this.getSingleNumberChar(); //得到0-9的char型数字
  break;
  case 1:
    retWord = this.getLowerOrUpperChar(0); //得到小写的char型字母
  break;
  case 2:
    retWord = this.getLowerOrUpperChar(1); //得到大写的char型字母
  break;
  }
    sRand += String.valueOf(retWord); //将得到的随机字符 连接起来
    g.setColor(new Color(red, green, blue)); //设置一个颜色
    g.drawString(String.valueOf(retWord), 2+(i) * x, codeY); //将字符写到图片中 对应的位置
  }
    // 将认证码存入SESSION
    session.setAttribute("rand", sRand); //将得到的随机字符存入到session回话中,验证的时候可以调用
    // 图象生效
    g.dispose(); //释放g 对象
    ServletOutputStream responseOutputStream = response.getOutputStream(); //输出流
    // 输出图象到页面
    ImageIO.write(image, "JPEG", responseOutputStream); //以JPEG的格式输出

    // 以下关闭输入流!
    responseOutputStream.flush();//刷新并关闭流
    responseOutputStream.close();
  }

    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);
  }

    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
  }

    protected void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
  }

    // 将整型随机数字转换成char返回
    private char getSingleNumberChar() {
    Random random = new Random();
    int numberResult = random.nextInt(10);
    int ret = numberResult + 48; //将字符 '0‘ 转换成ascall码的时候 就是48
    return (char) ret;
  }

    //得到26个字符
    private char getLowerOrUpperChar(int upper) {
    Random random = new Random();
    int numberResult = random.nextInt(26);
    int ret = 0;
    if (upper == 0) {// 小写
    ret = numberResult + 97;
  } else if (upper == 1) {// 大写
    ret = numberResult + 65;
    }
    return (char) ret;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

    代码如下所示: 复制代码 代码如下: package com.hoo.util; import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.util.Random; import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletRequ

  • Java随机生成手机短信验证码的方法

    本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return */ public static String createRandom(boolean numberFlag, int length){ String retStr = ""; String strTable = numberFlag ? "1234

  • Java实现随机验证码功能实例代码

    现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用.验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行番茄花园xp系统下载提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 复制代码 代码如下: package com.servlet;import java.awt

  • 解析Java实现随机验证码功能的方法详解

    现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用.验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度.    我们可以使用servlet来实现随机验证码的实现. 复制代码 代码如下: package com.servlet; 

  • java随机验证码生成实现实例代码

    java随机验证码生成实现实例代码 摘要: 在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配 之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的人提出了不同的解决方案,但是很多人都使用了com.sun.image.这个包或者子包里面的类,而这个包结构下面的类都是不推荐使用的,我们应该依赖于java.或者javax.这些包结构下面的类,否则将来的可移植性就很不好(比如换成IBM的JDK就不行了),但

  • Java案例之随机验证码功能实现实例

    实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的.嘿嘿. 先上效果图: 源代码: RandomGen.java(实现产生验证码功能的类) package verificationcode; import java.util.Random; public class RandomGen { //生成四位不重复的验证码 public static S

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • Java实现随机验证码具体代码

    本文实例为大家分享了Java随机生成验证码的具体代码,供大家参考,具体内容如下 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.serv

  • java实现随机验证码图片生成

    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller /** * 获取随机数验证码图片 * * @param request HttpServletRequest * @param response HttpServletResponse */ @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) pub

  • Java 生成随机验证码图片的示例

    1.情景展示 登录时,生成随机验证码图片,如何实现?  2.原因分析 后台生成验证码并生成图片返回至前台 3.解决方案 导包 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.Ser

  • 利用iOS绘制图片生成随机验证码示例代码

    先来看看效果图 实现方法 .h文件 @property (nonatomic, retain) NSArray *changeArray; @property (nonatomic, retain) NSMutableString *changeString; @property (nonatomic, retain) UILabel *codeLabel; -(void)changeCode; @end .m文件 @synthesize changeArray = _changeArray;

  • Java实现图片验证码具体代码

    本文实例为大家分享了Java图片验证码代码,供大家参考,具体内容如下 网页显示效果: index.jsp 使用两种方式强制图片更新: 1.设置图片输出时不缓存. 2.用js改变请求的地址. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>第一个web项目的主页</

  • php 生成随机验证码图片代码

    复制代码 代码如下: <?php /** 默认首页 **/ class DefaultController extends AppController { public function index() { $len = 5; $str = "ABCDEFGHIJKLNMPQRSTUVWXYZ123456789"; $im = imagecreatetruecolor ( 70, 20 ); $bgc = imagecolorallocate($im, 255, 255, 255

  • java 微信随机红包算法代码实例

    前几天的一个晚上突然想到微信红包应该有一个随机算法,就自己试着写了下,也不知道对不对,看了看网上的说法,好像到现在为止官方也没有给出一个确切的算法,只好在这里献丑了,先贴出代码: public static double [] getMoney(double money, int num){ Random r = new Random(); DecimalFormat format = new DecimalFormat(".##"); double middle = Double.p

随机推荐