文档章节

Java-No.04 Java创建验证码代码实现

蓝汀华韶
 蓝汀华韶
发布于 2014/05/29 10:14
字数 457
阅读 74
收藏 6
package com.superscene.wbmsys.util;

import java.util.Arrays;

public class SecurityCode {

    public enum SecurityCodeLevel {Simple,Medium,Hard};
     
    public static String getSecurityCode(){
         return getSecurityCode(4,SecurityCodeLevel.Medium,false);
    }

     public static String getSecurityCode(int length,SecurityCodeLevel level,boolean isCanRepeat){

         int len=length;
         char[] codes={'1','2','3','4','5','6','7','8','9',
                       'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z',
                       'A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'};
         
         if(level==SecurityCodeLevel.Simple){
             codes=Arrays.copyOfRange(codes, 0,9);
         }else if(level==SecurityCodeLevel.Medium){
             codes=Arrays.copyOfRange(codes, 0,33);
         }
         int n=codes.length;
      
         if(len>n&&isCanRepeat==false){
             throw new RuntimeException(
                    String.format("创建验证码失败",
                                    len,level,isCanRepeat,n));
        }

        char[] result=new char[len];
        if(isCanRepeat){
             for(int i=0;i<result.length;i++){
                 int r=(int)(Math.random()*n);
                 result[i]=codes[r];
            }
         }else{
             for(int i=0;i<result.length;i++){
                 int r=(int)(Math.random()*n);
                 result[i]=codes[r];
                 codes[r]=codes[n-1];
                 n--;
             }
        }
         return String.valueOf(result);
    }
}
package com.superscene.wbmsys.util;

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.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

public class SecurityImage {

	public static BufferedImage createImage(String securityCode, int width, int height){
		
		int codeLength = securityCode.length();
        int fSize = 15;
        
        BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g=image.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.LIGHT_GRAY);
        g.setFont(new Font("Arial", Font.BOLD, height - 2));
        g.drawRect(0, 0, width - 1, height -1);
        Random rand = new Random();
        g.setColor(Color.LIGHT_GRAY);
        for(int i = 0;i < codeLength * 6;i++){
        	int x = rand.nextInt(width);
        	int y = rand.nextInt(height);
        	g.drawRect(x, y, 1, 1);
        }
        int codeY = height - 6;  
        g.setColor(new Color(19,148,246));
        g.setFont(new Font("Georgia", Font.BOLD, fSize));
        for(int i = 0; i < codeLength;i++){
        	g.drawString(String.valueOf(securityCode.charAt(i)), i * 12 + 3, codeY);
        }

        g.dispose();
        return image;
	}
	
	public static ByteArrayInputStream getImageAsInputStream(String securityCode, int width, int height){
		BufferedImage image = createImage(securityCode, width, height);
        return convertImageToStream(image);
    }
	
	private static ByteArrayInputStream convertImageToStream(BufferedImage image){
		ByteArrayInputStream inputStream = null;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try {
			ImageIO.write(image, "JPEG", bos);
			byte[] bts = bos.toByteArray();
			inputStream = new ByteArrayInputStream(bts);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return inputStream;
	}
}
@RequestMapping(params="method=getCheckCode",method=RequestMethod.GET)
	public void getCheckCode(HttpServletRequest request, HttpServletResponse response, @RequestParam("time") String time) {
    	String securityCode = SecurityCode.getSecurityCode(number, SecurityCodeLevel.Hard, false); 
    	request.getSession().setAttribute(Constants.USER_LOGIN_CODES, securityCode);
    	BufferedImage image = SecurityImage.createImage(securityCode, width, height); 
        ServletOutputStream out = null;
		try {
			out = response.getOutputStream();
			// 将图片转换为JPEG类型
			//JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			//encoder.encode(image);
			// 输出图象到页面
			ImageIO.write(image, "JPEG", response.getOutputStream());
			out.flush();
			//ServletActionContext.getPageContext().pushBody();
			out.close(); 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }


© 著作权归作者所有

蓝汀华韶
粉丝 36
博文 77
码字总数 80082
作品 0
海淀
程序员
私信 提问
Ubuntu 18.04.1 搭建Java环境和HelloWorld

一、搭建Java环境 系统环境 Ubuntu 18.04.1 JDK 8 IDEA 2018.2 1.下载JDK 官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择相应的版本,点击jdk,进入下...

王磊的博客
2018/08/24
0
0
Java虚拟机JVM内部体系结构

Java虚拟机JVM内部体系结构 易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。 JVM(Java虚拟机)是一个抽象...

LYQ1990
2018/07/18
228
0
在 JNI 编程中避免内存泄漏

此文转自 IBM developerWorks JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口。JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native code;在...

IBMdW
2011/04/26
985
1
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
2018/08/29
0
0
什么是Java语言?java语言简介

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的W...

阿秀a
2010/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
387
7
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
11
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部