验证码本质上是一张图片,即应该用标签,其中src属性决定了这是一张什么图片,因此可以让src为某一Action,每次点击时,都会更新这个src属性。

① 前台JSP页面

My JSP 'imgcode.jsp' starting page

function changeValidateCode() {

var currentTime= new Date().getTime();

var obj=document.getElementById("js_randyzm");

obj.src = "imgCodeAction?time=" + currentTime;

}

验证码:

" οnclick="changeValidateCode()" id="js_randyzm" height="25" width="70" />

看不清楚,点击换一张

当第一次跳转到该页面时,imgCodeAction就会被请求一次,以后只要点击图片或者超链接,就会更换一次验证码。注意:javascript代码中,如果没有time=xxxxxxxxx这个参数,则标签的src属性就会一直是imgCodeAction 这个值,导致验证码不会更换,加这个参数是为了区分src属性。

②Action的实现

package edu.njcit.action.imgcode;

import edu.njcit.action.ActionSupportBase;

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.util.Random;

import javax.imageio.ImageIO;

import javax.imageio.stream.ImageOutputStream;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class ImgCodeAction extends ActionSupportBase {

private static final long serialVersionUID = 1L;

private ByteArrayInputStream inputStream;

@Override

public String execute() throws Exception {

final int width = 65; //验证码图片的宽

final int height = 20; //验证码图片的高

final int numCount = 4; //验证码个数(数字)

String randomString = ""; //随机产生的认证码字符串内容

// 在内存中创建图象

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

// 获取图形上下文

Graphics g = image.getGraphics();

// 生成随机类

Random random = new Random();

// 设定背景色

g.setColor(getRandColor(200, 250));

g.fillRect(0, 0, width, height);

// 设定字体

g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到

g.setColor(getRandColor(160, 200));

for (int i = 0; i < 155; i++) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

g.drawLine(x, y, x + xl, y + yl);

}

for (int i = 0; i < numCount; i++) {

String rand = String.valueOf(random.nextInt(10));

randomString += rand;

// 将认证码显示到图象中

g.setColor(new Color(20 + random.nextInt(110), 20 + random

.nextInt(110), 20 + random.nextInt(110)));

// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

g.drawString(rand, 13 * i + 6, 16);

}

// 将认证码存入SESSION,用于和用户输入的进行比较

ActionContext.getContext().getSession().put("randomString", randomString);

// 图象生效

g.dispose();

ByteArrayOutputStream output = new ByteArrayOutputStream();

ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);

ImageIO.write(image, "JPEG", imageOut);

imageOut.close();

ByteArrayInputStream input = new ByteArrayInputStream(output

.toByteArray());

//设定字节流

this.setInputStream(input);

return ActionSupport.SUCCESS;

}

/*

* 给定范围获得随机颜色

*/

private 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);

}

public void setInputStream(ByteArrayInputStream inputStream) {

this.inputStream = inputStream;

}

/**

* 对应struts.xml配置中inputStream

* @return 字节流

*/

public ByteArrayInputStream getInputStream() {

return inputStream;

}

}

③struts2的配置文件中进行配置

image/jpeg

inputStream

最终效果图如下:

java 当中的验证码_Java Web中验证码的实现相关推荐

  1. Java中用JS那些_java web中javascript主要用哪些?

    java web中javascript主要用途是在页面上完成特定按钮的事件功能并且实现前后台交互. JavaScript 是一种跨平台,面向对象的脚本语言.作为一种小巧且轻量级的语言,JavaScri ...

  2. java 文件 缓冲区大小_Java web 中文件下载遇到的缓冲大小问题

    刚才自己做一个小例子,就是在android端点击一个button,然后从服务器端下载文件到手机SD卡.结果却遇到了问题,刚开始挺兴奋的,因为自己做的可以下载下来文件了,但是自习看才发现有问题,那就是下 ...

  3. java邮箱验证码_Java实现邮箱验证码

    原标题:Java实现邮箱验证码 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 邮箱验证码 一般能使用邮箱注 ...

  4. java web工程中如何添加图片_java web中如何添加图片

    java web中如何添加图片 对于java可视化界面插入背景图片只需要background-image:url(图片路径)就行,而对于web项目中,并非如此 效果如下: 我们就需要在jsp页面中写J ...

  5. java入侵检测源码_Java Web中的入侵检测及简单实现

    作者:EasyJF开源团队 大峡 一.简介 在Java Web应用程中,特别是网站开发中,我们有时候需要为应用程序增加一个入侵检测程序来防止恶意刷新的功能,防止非法用户不断的往Web应用中重复发送数据 ...

  6. java 问号乱码_Java web中常见编码乱码问题(一)

    最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...

  7. Web中验证码的作用

    我来解释一下验证码的作用! 验证码是用来防止暴破(暴力破解)的! 要知道如果防止,我们就要先知道暴力破解原理是什么! 暴力破解就是利用程序,在短时间内按照一定的规律,来输入用户名和密码,逐个的测试! ...

  8. java session 永不过期_Java Web Application使Session永不失效(利用cookie隐藏登录)

    在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...

  9. java cookie的有效期_Java Web cookie的有效期

    Java Web中cookie中的有效期 (1)Java Web后台添加cookieCookie emailCook = new Cookie(name2, "whuang"); ...

最新文章

  1. 巴菲特的逻辑数据分析
  2. SQL语句在数据库中是如何执行的
  3. Sqlserver循环嵌套
  4. 【KVM系列04】KVM的I/O 设备直接分配和SR-IOV
  5. iview 下拉select样式_Vue.js相关:iview实现select tree树形下拉框的示例代码
  6. 使用Arquillian(远程)测试OpenLiberty
  7. RMI(Remote Method Invocation,远程方法调用)
  8. Uber提出有创造力的POET:自行开发更困难环境和解决方案
  9. mysql中怎么在列中使用时间函数_mysql中关于时间的函数使用教程
  10. zabbix监控MHA及自动启动
  11. gitlab+jenkins=自动化构建
  12. Robust line matching through line–point invariants
  13. 一个按键控制数码管的开和关_单片机是否能用一个按键控制数码管的显示图?...
  14. office2010安装报错
  15. 自媒体入门如何制作出优质视频,有这5款软件就够了
  16. Jmeter使用教程(图文并茂)|实战干货
  17. Android USB 开发
  18. u深度制作linux启动盘制作工具,U深度制作u盘启动盘制作工具
  19. Mongodb修改器
  20. Mac清理磁盘管理内存的软件推荐

热门文章

  1. canvas学习-----1px线条模糊问题
  2. 2003 Server下隐藏帐号的建立
  3. Net设计模式实例之装饰者模式(Decorator Pattern)(1)
  4. dbproviderfactories.getfactory mysql_asp.net下使用DbProviderFactories的数据库操作类
  5. TDL(HDU-6641)
  6. 奇怪的电梯(信息学奥赛一本通-T1360)
  7. 单词方阵(洛谷-P1101)
  8. 信息学奥赛一本通C++语言——1010:计算分数的浮点数值
  9. 1 SD配置-企业结构-定义-定义销售组织
  10. python网络编程项目_python网络编程(1):客户端与网络编程简介