`

java验证码的实现(ssi)

阅读更多

总体流程:

    html页面发送生成验证码请求,java服务端生成对应的验证吗并回写到页面,点击验证码或者刷新页面及页面报错情况下,验证码都要刷新。

html端:

 

<img id="imageCode" alt="验证码" src="image_getImgCode.do" 
    style="margin-left:20px;height:36px;cursor: pointer;" />
$(function(){
    //为图片绑定单击事件
    $('#imageCode').click(function(){
       	//设置src属性为action的参数为当前时间,保证验证码点击之后可以变换
       	$(this).attr('src', 'image_getImgCode.do?dt=' + new Date().getTime());
    });
});

struts.xml:

 

 

<action name="image_*" class="imageDemoAction" method="{1}"></action>

spring配置文件:

 

 

<bean id="imageDemoAction" class="com.infohold.businessyun.action.ImageDemoAction" 
    scope="prototype">
</bean>

 action:

public class ImageDemoAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	private Logger logger = Logger.getLogger(ImageDemoAction.class);
	//stream result只能输出InputStream类型
    private InputStream imageStream;

    public InputStream getImageStream() {
        return imageStream;
    }

    public void setImageStream(InputStream imageStream) {
        this.imageStream = imageStream;
    }
    
    public void getImgCode() throws IOException{
    	HttpServletResponse response = ServletActionContext.getResponse();
    	HttpServletRequest request = ServletActionContext.getRequest();
        //生成验证码
        Map<String, BufferedImage> map = ImageUtil.createImage();
        String key = map.keySet().iterator().next();
        HttpSession session = request.getSession();
        session.removeAttribute("key");
        session.setAttribute("key", key);
        BufferedImage image = map.get(key);
        try{
            imageStream = ImageUtil.getInputStream(image);
            OutputStream outputStream = response.getOutputStream();  
            ImageIO.write(image, "jpeg", outputStream);  
            outputStream.close();
        }catch(IOException e){
        	logger.error("生成验证码失败:"+e.getMessage());
        	e.printStackTrace();
        }
    }
}

 工具类:

/**
 * 简单验证码生成工具
 * ImageUtil, 用于生成验证码
 * createImage方法返回一个Map类型,Map 的key是所生产的验证码的字符串,
 * Map的value是所生产的BufferImage类型的验证码;
 * getInputStream方法将 BufferImage转成InputStream类型;
 * @author jiqing
 */
public class ImageUtil {
    private static final char[] chars = {'0','1','2','3','4','5','6','7','8','9',
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','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','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    private static final int SIZE = 4;            //字符数
    private static final int LINES = 12;        //干扰线数量
    private static final int WIDTH = 130;        //生成的验证码图片的宽度
    private static final int HEIGHT = 60;        //生成的验证码图片的长度
    private static final int FONT_SIZE = 40;    //字体大小

    public static Map<String, BufferedImage> createImage(){
        //用户保存字符串
        StringBuffer sb = new StringBuffer();
        //BufferImage类型的验证码
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        //获得画笔 
        Graphics g = image.getGraphics();
        g.setColor(Color.LIGHT_GRAY);    //设置背景色
        g.fillRect(0, 0, WIDTH, HEIGHT);//将背景色填充到图片中
        Random ran = new Random();    //获得一个Random对象
        
        //画字符
        for(int i=1; i<=SIZE; i++){
            int r = ran.nextInt(chars.length);    //得到一个随机的下标, chars 是保存着若干字符的char字符
            g.setColor(getRandomColor());        //得到一个随机的颜色
            g.setFont(new Font(null, Font.BOLD+Font.ITALIC, FONT_SIZE));    //设置字体大小
            g.drawString(chars[r]+"", (i-1)*WIDTH/SIZE, (int)(HEIGHT*0.7));    //画字符
            sb.append(chars[r]);
        }
        
        //画干扰线
        for(int i=1; i<=LINES; i++){
            g.setColor(getRandomColor());    //同样,干扰线也是用随机的颜色
            g.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), 
                    ran.nextInt(WIDTH), ran.nextInt(HEIGHT));//随机设置干扰线的方向
        }
        
        //将图片中的字符串保存为Map对象的key,BufferedImage保存为value
        Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();    
        map.put(sb.toString(), image);
        return map;
    }

    /**
     * 获得一个随机的颜色 返回 Color对象
     * @return
     */
    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); 
        return color;
    }

    /**
     * 将 BufferImage转成InputStream类型
     * @param image
     * @return
     * @throws IOException
     */
    public static InputStream getInputStream(BufferedImage image) throws IOException{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
        encoder.encode(image);
        byte[] imageBts = bos.toByteArray();
        InputStream in = new ByteArrayInputStream(imageBts);
        return in;
    }
}

 

 

分享到:
评论

相关推荐

    FPGA之SSI接口协议实现 fpga开发.pdf

    FPGA之SSI接口协议实现 FPGA之SSI接口协议实现是指在 Field-Programmable Gate Array(现场可编程门阵列)中实现 Synchronous Serial Interface(同步串行接口)协议。SSI 是一种全双工的串行接口,允许芯片与多种...

    ssi框架简单搭建。。。

    在Java环境下,我们可以使用各种框架来实现SSI功能,以提高网站的开发效率和可维护性。下面我们将详细探讨Java中的SSI框架搭建及其应用。 首先,理解SSI的基本概念是必要的。SSI主要通过在HTML文件中使用特定的指令...

    基于javacv和SSI框架的图像检索系统

    总的来说,这个项目展示了如何结合JavaCV和SSI框架来构建一个实用的图像检索系统,对于理解图像处理、特征提取和高效搜索索引的实现具有很好的学习价值。开发者可以从中学习到如何在Java环境下处理图像数据,如何...

    fpga与ssi通信

    基于FPGA的SSI通信控制器的设计和实现是通过使用VHDL硬件描述语言,基于Xilinx公司的FPGA设计平台,实现了一个可扩展的SoPC架构的通信控制器。 该控制器能够灵活地进行IP核模块扩展,并可作为外围处理机与TI公司TMS...

    ssi.rar_ibatis_ibatis struts2_java ssi_myeclipse ssi_struts2

    "ibatis_struts2"表示iBatis和Struts2的集成使用,"java_ssi"可能是指在Java环境下实现的SSI功能,"myeclipse_ssi"则表明在MyEclipse中进行了SSI相关的开发工作。这些标签为理解项目的技术栈提供了指导。 压缩包内...

    采用SSI协议实现的绝对值编码器

    在硬件设计中,采用Verilog语言实现SSI通信协议,这是一种硬件描述语言,用于描述数字系统的结构和行为。通过Verilog编程,可以创建出能够处理SSI协议的逻辑电路,实现编码器与主控系统的高效通信。 绝对值编码器与...

    ssi整合 jar包

    2. **Java中的SSI实现**:由于Java标准库不直接支持SSI,所以需要第三方库,例如`JSSIServlet`或者`SSIProcessor`等。这些库通常会提供一个Servlet,可以在HTTP请求处理链中拦截并处理包含SSI指令的页面。 3. **...

    java-ssi医疗系统

    【标题】"java-ssi医疗系统"是一个基于Java技术栈的医疗信息系统,它采用Maven作为构建工具,结合Spring框架的三个核心组件——Spring、SpringMVC和Oracle数据库,为医疗机构提供了一整套功能完善的解决方案。...

    SSI框架的实现

    在本教程中,我们将深入探讨如何实现SSI框架,并构建一个功能完善的动态网页系统。 1. **SSI基本语法** SSI的基本语法以`&lt;!--#`开头,`--&gt;`结尾,中间插入不同的指令。例如,`&lt;!--#include virtual="header....

    SSI例子(很全面,下载请评论)

    在本压缩包中,我们看到的是一个基于JAVA实现的SSI框架搭建实例。 【描述】:“JAVA SSI框架搭建的例子,字段很多,写的很全面,增删改查各种功能,ECLIPSE工具下。”这表明提供的压缩包内包含了一个完整的Java应用...

    【LabVIEW FPGA入门】使用FPGA实现串行同步接口(SSI)

    《LabVIEW FPGA入门:实现串行同步接口(SSI)》 LabVIEW FPGA是NI(National Instruments)提供的一个强大的工具,允许用户使用图形化编程环境来设计和实现FPGA(Field Programmable Gate Array)应用程序。本篇...

    实现简单SSI功能(注解和xml)

    在本文中,我们将深入探讨如何实现简单的服务器端包含(SSI,Server Side Include)功能,同时结合XML和注解这两种技术。SSI是一种Web开发技术,它允许我们在HTML文档中嵌入服务器端的脚本或指令,从而动态生成网页...

    stm32 定时器 模拟SPI 读SSI编码器

    在嵌入式系统开发中,STM32微控制器是一个广泛使用的平台,因其高效能和低功耗特性而受到...通过理解并实施这些步骤,开发者可以成功地从SSI编码器读取多圈绝对值数据,从而在各种工业应用中实现精确的位置检测和控制。

    SSI-ABZ.rar_FPGA ABZ_FPGA SSI_SSI 转 ABZ信号FPAG程序_abz_ssi fpga

    标签中的"ssi_转_abz信号fpag程序"进一步强调了这是针对特定信号转换的FPGA程序,而"abz ssi_fpga"则表明这两个接口都在FPGA实现中得到了支持。 压缩包内的文件"SSI-ABZ"可能是设计文件、配置文件或者是编译后的....

    SSI 增删改查 范例

    - `SSI范例`这个文件很可能包含了一个或多个HTML文件,这些文件使用了SSI指令来调用Java后端的Java方法或iBatis的XML配置文件,实现数据操作。 - 示例中可能还会包含Java Servlet或JSP文件,它们处理HTTP请求,...

    ssi框架代码实例

    SSI框架,即Struts2、Spring和iBatis的集成框架,是Java Web开发中常见的技术栈,用于构建高效、可维护的企业级应用程序。这个压缩包文件“ssi_curd”很可能包含了一个基本的CRUD(创建、读取、更新、删除)操作的...

    一种SSI接口光电编码器数据并行采集设计方法

    SSI接口即同步串行接口具有传输速度快、连线简单、抗干扰能力强等优点,因而在光电编码器上得到了越来越广泛的应用,但其与计算机接口的连接实现较为复杂,在一定程度上影响了SSI接口光电编码器的推广和应用。...

    SSI框架搭建增删改查以及分页

    SSI框架,即Struts2、Spring和Ibatis的集成,是一种常见的Java Web开发技术栈,用于构建高效、灵活的企业级应用程序。在这个项目中,我们将会深入探讨如何利用这些技术实现数据库的增删改查(CRUD)操作以及分页功能...

    SSI_read.rar_SSI verilog_SSI 11bit read_SSI_read_ssi verilog_v

    在本项目中,我们关注的是如何使用Verilog硬件描述语言来实现一个11位编码器的SSI读取功能。Verilog是一种广泛应用于集成电路设计、验证的语言,能够描述数字系统的结构和行为。 首先,理解11位编码器的含义是关键...

    基于ssi框架的图书管理

    不过,随着Web技术的发展,SSI已经被更强大的服务器端脚本语言如PHP、ASP.NET、Java JSP等取代。这些语言提供了更丰富的功能和更好的可扩展性。尽管如此,理解SSI对于了解早期Web开发的历史和技术演进仍然具有重要...

Global site tag (gtag.js) - Google Analytics