写在前面:

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

生成图片验证码工具类并在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

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

  1. MVC之图片验证码

    MVC之图片验证码 controller中的action方法public ActionResult GetValidateCode() { ValidateCode vCode = new Valid ...

  2. Django商城项目笔记No.4用户部分-注册接口-图片验证码

    Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...

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

    首先,在项目模型(Model)层中建立一个生成图片验证码的类ValidationCodeHelper,代码如下: public class ValidationCodeHelper { //用户存取验 ...

  4. MVC中登录页图片验证码总结

    直接上代码了 using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Imagi ...

  5. Flask实战第43天:把图片验证码和短信验证码保存到memcached中

    前面我们已经获取到图片验证码和短信验证码,但是我们还没有把它们保存起来.同样的,我们和之前的邮箱验证码一样,保存到memcached中 编辑commom.vews.py .. from utils i ...

  6. ASP.NET中图片验证码与js获取验证码的值

    现在的程序中,为了防止用户恶意点击,我们一般都会加上验证,现在比较普遍的是加上图片验证码或者手机短信验证.验证码一般都是防机器不防人,有效的防止了恶意点击. 那么在webform中如何生成动态的图片验 ...

  7. Struts2中的异步提交(ajaxfileupload异步上传(图片)插件的使用)

    server端採用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1. ...

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

    应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (ran ...

  9. python-webdriver中添加cookie,解决添加了图片验证码的问题

    遇到问题:之前一直能用的脚本突然跑不通了,仔细一看原来是研发新加了图片验证码...... 解决问题: 手动抓取了cookie并塞进去,解决问题.当然如果你的cookie有效期太短或者是随着会话关闭就失 ...

随机推荐

  1. PHP截取带有汉字的字符串,将汉字按两个字节计算

    <?php header("Content-type:text/html;charset=utf-8"); /** *截取字符串,汉字占两个字节,字母占一个字节 *页面编码必 ...

  2. Android开发之漫漫长途 番外篇——自定义View的各种姿势1

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. 隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)

    Preface 这几天关于Office的一个远程代码执行漏洞很流行,昨天也有朋友发了相关信息,于是想复现一下看看,复现过程也比较简单,主要是简单记录下. 利用脚本Github传送地址 ,后面的参考链接 ...

  4. Ansible(一) 配置安装

    puppet ruby开发 salt python开发,有客户端,使用Rabbitmq消息队列,支持并发,在机器数量很多时效果比ansible好. ansible python开发, 没有客户端,基于 ...

  5. lumen 中间件详解

    我来给大家,讲解一下lumen中的中间件,高手勿喷. 首先,我们看下lumen中文档中的写法,我这里看的是5.3中文文档.https://lumen.laravel-china.org/docs/5. ...

  6. 项目实战9—企业级分布式存储应用与实战MogileFS、FastDFS

    企业级分布式存储应用与实战-mogilefs 环境:公司已经有了大量沉淀用户,为了让这些沉淀用户长期使用公司平台,公司决定增加用户粘性,逐步发展基于社交属性的多样化业务模式,决定开展用户讨论区.卖家秀 ...

  7. Python学习一

    安装时遇到的问题 安装anaconda3.0到D盘之后,配置好两个环境变量:D:\anaconda和D:\anaconda\Scripts.发现在命令行中执行python指令可以,但conda指令却是 ...

  8. java agent

    cmd使用java -help可以看到关于agent参数: -agentlib:<libname>[=<选项>] 加载本机代理库 <libname>, 例如 -ag ...

  9. 【LintCode·入门】斐波那契数列

    斐波那契数列 描述 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, ...

  10. mysql 系统性浅聊 myisam 存储引擎【原创】

    >>思维导图 >>介绍 mysql中的存储引擎都是以插件的形式存在,目前用的最多存储引擎就是innodb和myisam.MySQL5.5.5以后(包括5.5.5)默认使用Inn ...