图片验证码(Struts2中使用)

写在前面:

  最近在项目中做了一个登录页面,用到了图片验证码的功能,所以记录一下。方便之后再有用到,直接拿来用即可。其实图片验证码的生成都是有固定步骤的,网上也有很多的例子,有的时候,如果不想深究,都是可以直接拿来用的。嘻嘻~~~~

生成图片验证码工具类并在struts2中使用,大概需要以下五个步骤:

1.获取随机数验证码字符串2.生成验证码图片3.将图片转为图片流格式4.提供图片流类型的get()方法5.配置struts.xml

其实上面的前三个步骤,都是在为生成图片验证码做准备,我们将前三步的内容,封装成一个图片验证码工具类。

图片验证码工具类:
/**
 * Description:生成图片验证码工具类
 *           1.获取随机数验证码字符串
 *           2.生成验证码图片
 *           3.将图片转为图片流格式
 * Author: Eleven
 * Date: 2017/12/16 8:35
 */
public class CodeUtil {

    //1.生成随机数验证码字符串
    public static String getCodeStr(){

        //字符数组(除去易混淆的数字0、数字1、字母l、字母o、字母O)
        char[] codes = "23456789ABCDEFGHIJKMNPQRSTUVWXYZ".toCharArray();

        //指定验证码长度
        int len = 4;
        //生成随机的验证码字符串
        String code = "";
        for(int i=0;i<len;i++){
            int r = (int) (Math.random()*codes.length);
            code += String.valueOf(codes[r]);
        }
        System.out.println("验证码字符串"+code);

        return code;

    }

    /**
     *生成验证码图片
     * @param codeStr 验证码字符串
     * @return  图片
     */
    public static BufferedImage createImage(String codeStr){
        //验证码长度
        int len = codeStr.length();
        //字体大小
        int fSize = 20;
        int fWidth = fSize + 1;
        //图片宽度
        int width = fWidth * len + 6;
        //图片高度
        int height = fSize * 2 + 1;
        //图片
        BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB );
        //获取画笔
        Graphics g = img.getGraphics();

        //设置背景颜色 并填充
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0,0,width,height);

        //设置边框颜色
        g.setColor(Color.LIGHT_GRAY);
        g.drawRect(0,0,width-1,height-1);

        //绘制小点点 1*1的小矩形
        g.setColor(Color.LIGHT_GRAY);
        Random random = new Random();
        for(int i=0;i<len*6;i++){
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            //1*1的小矩形
            g.drawRect(x,y,1,1);
        }

        //或者填充100条干扰线
       /* for (int i = 0; i < 100; i++) {
            g.setColor(getRandColor(160, 200));
            g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
        }*/

        //绘制验证码
        int codeY = height - 10;
        //g.setColor(new Color(19,148,246));
        //设置字体
        g.setFont(new Font(null, Font.BOLD, fSize));
        for(int i=0;i<len;i++){
            //设置随机颜色
            g.setColor(new Color(random.nextInt(150), random.nextInt(150), random.nextInt(150)));
            g.drawString(String.valueOf(codeStr.charAt(i)),i * 17 + 9, codeY);
        }

        //关闭资源
        g.dispose();

        return img;
    }

    /**
     * 验证码图片转为流格式
     * @param img 图片
     * @return 图片流
     */
    public static ByteArrayInputStream getImgAsInputStream(BufferedImage img){
        ByteArrayInputStream inputStream = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos);
        try {
            jpeg.encode(img);
            byte[] bts = bos.toByteArray();
            inputStream = new ByteArrayInputStream(bts);

        } catch (IOException e) {
            e.printStackTrace();
            throw new BusinessException("图片转为图片流格式异常了呀");
        }

        return inputStream;

    }

    //填充干扰线的时候生成随机颜色
    public static 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);
    }
}

工具类已经写好了(前三个步骤已经做完了),在action中进行调用(记得第四步的提供图片流的get()方法)

action类:

/**
 * Description:登录Action
 * Author: Eleven
 * Date: 2017/12/14 19:28
 */
@Controller("LoginAction")
public class LoginAction2 extends BaseAction{

    //图片流
    private ByteArrayInputStream inputStream;

    public String getCode(){
        //利用验证码工具类生成图片验证码
        //1.获取随机数验证码字符串
        String code = CodeUtil.getCodeStr();
        //2.生成验证码图片
        BufferedImage image = CodeUtil.createImage(code);
        //3.将图片转为图片流格式
        inputStream = CodeUtil.getImgAsInputStream(image);
        //获取验证码字符串存到session中
        ActionContext.getContext().getSession().put("code", code);

        return SUCCESS;
    }

   //4.提供图片流的get()方法
    public ByteArrayInputStream getInputStream() {
        return inputStream;
    }
}

完成第5步,配置struts.xml文件:

 <!--验证码-->
        <action name="getCode" class="LoginAction" method="getCode">
            <result type="stream">
                <param name="contentType">image/jpeg</param>
                <!--与action中提供get方法的变量名相同-->
                <param name="inputName">inputStream</param>
            </result>
        </action>

经过上面的几个步骤,就已经大功告成了,下面我们在jsp页面进行调用:

<img id="codeImg" src="getCode" name="codeImg" height="25px" width="70px" alt="看不清,换一张" onclick="changeCode()">

src是调用获取验证码的action,可以点击图片进行更换验证码,调用的js如下:

<script type="text/javascript">
  function changeCode(){
       //加一个时间戳,防止浏览器不重新发送请求就直接使用缓存中的图片,而导致点击时不进行刷新
            document.form1.codeImg.src = "${baseURL}/getCode.action?timeStamp=" + new Date().getTime();

        }
</script>
成功截图:小小迷你图,啊哈哈哈~~~~~真可爱。。。。。。

参考链接:http://www.cnblogs.com/dongliyang/archive/2012/08/24/2654431.html
时间: 2024-10-29 02:37:12

图片验证码(Struts2中使用)的相关文章

struts2中验证码的生成和使用

第一步生产字符串: package com.yancode.demo; import java.util.Arrays; /* * 一步一步来,要生成验证码图片,首先要有验证码,然后才能在画在图片上.为了能够灵活控制验证码, * 特别编写了SecurityCode类,它向外提供随机字符串.并且可以控制字符串的长度和难度. * SecurityCode类中提供的验证码分三个难度,易(全数字).中(数字+小写英文).难(数字+大小写英文). * 难度使用枚举SecurityCodeLevle表示,避

web 图片验证码 验证

做一个图片验证码 界面中的代码 1 验证码:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><asp:Image ID="Image1" ImageUrl="YZM.aspx" runat="server" /> 2 <asp:Button ID="Button1" runat=&q

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

在mvc中实现图片验证码的刷新

首先,在项目模型(Model)层中建立一个生成图片验证码的类ValidationCodeHelper,代码如下: public class ValidationCodeHelper { //用户存取验证码字符串 public string validationCode = String.Empty; Random ram = new Random(); Graphics g = null; int bgWidth = 0; int bgHeight = 0; public string Font

django项目登录中使用图片验证码

应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code_img(request): # 方式: from PIL import Image, ImageDraw, ImageFon

struts向网页输出图片验证码

前言:今天做个功能需要展示图片到页面,并不是下载,在网上搜了老半天,大部分都是下载,有的话也是只能在IE下进行输出,其它浏览器就都是下载了. Action代码: [java] view plain copy print? public String processImage(){ String key = ServletActionContext.getRequest().getParameter("key"); if(StringUtils.isEmpty(key)){ return

自己写一个图片验证码程序

本程序基于struts2,用action响应请求. 一.首先,创建一个用于产生随即验证码图片的类ImageCode.java. 1 package com.exp.image; 2 3 import java.awt.BasicStroke; 4 import java.awt.Color; 5 import java.awt.Font; 6 import java.awt.Graphics; 7 import java.awt.Graphics2D; 8 import java.awt.Ren

水印、图片验证码

(貌似这个验证码不能获取,假设设置一个隐藏的label来记录又失去了他的意义) 一.水印 1.画布 System.Drawing.Image img = System.Drawing.Image.FromStream(FileUpload1.FileContent); 2.创建绘制对象,告诉它往哪张图片上绘制 Graphics g = Graphics.FromImage(img); 3.绘制的内容 string s = "www.itnba.com"; 4.绘制的字体 Font f