`

页面中验证码的生成总结(struts2)

阅读更多

下面是结合用Struts2 来生成的例子

感谢原文作者的贡献,这个是原文地址:http://mxl86.iteye.com/blog/300128

 

 

1、login.jsp页面程序

<script type="text/javascript"> 
function changeValidateCode(obj) { 
//获取当前的时间作为参数,无具体意义 
var timenow = new Date().getTime(); 
//每次请求需要一个不同的参数,否则可能会返回同样的验证码 
//这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。 
obj.src="rand.action?d="+timenow; 
} 
</script>

在表单中添加下面这句话:
<s:text name="random"></s:text>:<s:textfield name="rand" size="5"></s:textfield><img src="rand.action" title="点击图片刷新验证码"/>

 

 

2、RandomNumUtil.java 生成验证码的类文件

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;
public class RandomNumUtil { 
private ByteArrayInputStream image;//图像 
private String str;//验证码 

private RandomNumUtil(){ 
init();//初始化属性 
} 
/* 
* 取得RandomNumUtil实例 
*/ 
public static RandomNumUtil Instance(){ 
return new RandomNumUtil(); 
} 
/* 
* 取得验证码图片 
*/ 
public ByteArrayInputStream getImage(){ 
return this.image; 
} 
/* 
* 取得图片的验证码 
*/ 
public String getString(){ 
return this.str; 
} 

private void init() { 
// 在内存中创建图象 
int width=85, height=20; 
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); 
} 
// 取随机产生的认证码(6位数字) 
String sRand=""; 
for (int i=0;i<6;i++){ 
String rand=String.valueOf(random.nextInt(10)); 
sRand+=rand; 
// 将认证码显示到图象中 
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 
// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 
g.drawString(rand,13*i+6,16); 
}
//赋值验证码
this.str=sRand; 

//图象生效 
g.dispose(); 
ByteArrayInputStream input=null; 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
try{ 
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); 
ImageIO.write(image, "JPEG", imageOut); 
imageOut.close(); 
input = new ByteArrayInputStream(output.toByteArray()); 
}catch(Exception e){ 
System.out.println("验证码图片产生出现错误:"+e.toString()); 
} 

this.image=input;/* 赋值图像 */ 
} 
/* 
* 给定范围获得随机颜色 
*/ 
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); 
}
}

 

3、RandomAction.java  生成验证码的action程序

import java.io.ByteArrayInputStream;
import com.mxl.util.RandomNumUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class RandomAction extends ActionSupport{ 
private ByteArrayInputStream inputStream; 
public String execute() throws Exception{ 
RandomNumUtil rdnu=RandomNumUtil.Instance(); 
this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片 
ActionContext.getContext().getSession().put("random", rdnu.getString());//取得随机字符串放入HttpSession 
return SUCCESS; 
} 
public void setInputStream(ByteArrayInputStream inputStream) { 
this.inputStream = inputStream; 
} 
public ByteArrayInputStream getInputStream() { 
return inputStream; 
}
}

 

4、LoginAction.java 验证验证码的action

private String rand; //表单中的rand
public String getRand() {
return rand;
}
public void setRand(String rand) {
this.rand = rand;
}
//从session中取出RandomAction.java 中生成的验证码random
String arandom=(String)(ActionContext.getContext().getSession().get("random"));

//下面就是将session中保存验证码字符串与客户输入的验证码字符串对比了
if(arandom.equals(this.getRand())) {
ActionContext.getContext().getSession().put("user", this.getUsername());
return SUCCESS;
}
else {
return ERROR;
}

 

5、配置struts.xml文件

<!-- Random验证码 -->
<action name="rand" class="com.mxl.rand.RandomAction">   
       <result type="stream">   
            <param name="contentType">image/jpeg</param>   
            <param name="inputName">inputStream</param>   
       </result>
   </action>

 

说明:

如果想修改验证码生成的个数,需要修改以下几个地方:

 

第一点:

int width=85, height=20;



第二点:

for (int i=0;i<6;i++)



数字6,修改成你想生成的位数就可以了~

 

 

 

下面是用servlet来生成验证码的例子

感谢原文作者的贡献,该文章对验证码生成的各种方法做了个总结,很不错了。这个是原文地址:

http://blog.csdn.net/wirror800/archive/2009/02/16/3897115.aspx

servlet文件

 

public class AuthImage extends HttpServlet   
{   
  
    private static final String CONTENT_TYPE = "text/html; charset=gb2312";   
    //设置字母的大小,大小   
    private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);   
    public void init() throws ServletException   
    {   
        super.init();   
    }   
    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 service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException   
    {   
        response.setHeader("Pragma","No-cache");   
        response.setHeader("Cache-Control","no-cache");   
        response.setDateHeader("Expires", 0);   
        //表明生成的响应是图片   
        response.setContentType("image/jpeg");   
           
        int width=100, height=18;   
        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(1, 1, width-1, height-1);   
        g.setColor(new Color(102,102,102));   
        g.drawRect(0, 0, width-1, height-1);   
        g.setFont(mFont);   
  
        g.setColor(getRandColor(160,200));   
  
        //画随机线   
        for (int i=0;i<155;i++)   
        {   
            int x = random.nextInt(width - 1);   
            int y = random.nextInt(height - 1);   
            int xl = random.nextInt(6) + 1;   
            int yl = random.nextInt(12) + 1;   
            g.drawLine(x,y,x + xl,y + yl);   
        }   
  
        //从另一方向画随机线   
        for (int i = 0;i < 70;i++)   
        {   
            int x = random.nextInt(width - 1);   
            int y = random.nextInt(height - 1);   
            int xl = random.nextInt(12) + 1;   
            int yl = random.nextInt(6) + 1;   
            g.drawLine(x,y,x - xl,y - yl);   
        }   
  
        //生成随机数,并将随机数字转换为字母   
        String sRand="";   
        for (int i=0;i<6;i++)   
        {   
            int itmp = random.nextInt(26) + 65;   
            char ctmp = (char)itmp;   
            sRand += String.valueOf(ctmp);   
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));   
            g.drawString(String.valueOf(ctmp),15*i+10,16);   
        }   
  
        HttpSession session = request.getSession(true);   
        session.setAttribute("rand",sRand);   
        g.dispose();   
        ImageIO.write(image, "JPEG", response.getOutputStream());   
    }   
    public void destroy()   
    {   
    }   
}  

 

web.xml

 

 

<servlet>   
    <servlet-name>image</servlet-name>   
    <servlet-class>org.test.web.AuthImage</servlet-class>   
</servlet>   
  
<servlet-mapping>   
    <servlet-name>image</servlet-name>   
 <url-pattern>/authImage</url-pattern>   
</servlet-mapping>  

 

html页面和上面struts2 例子的页面是类似的,只是把图像生成的路径改成servlet就行了。。

例如:<img src="authImage"/>

 

总结下:

  总的来说验证码的生成也并不是很困难,方法都是类似的。如果项目集成了struts2的话,用servlet类的方法来生成验证码的话,会有点麻烦,因为struts2的拦截器会把servlet类给拦截了,解决办法我还没想到。。 

如果要生成中文的验证码的话,可参考下面的文章:http://gx80.iteye.com/blog/148851

 

分享到:
评论
3 楼 pipiaha 2012-04-12  
你好,感谢lz的文章,在这里学习了。
顺便提一下,你的页面里,img标签少了触发:onclick="changeValidateCode(this)"
2 楼 一笑_奈何 2012-01-05  
我想问你一下,你这个有试过么 ,我最近也遇到这样的问题?????
1 楼 mxl86 2009-08-14  
来踩踩你

相关推荐

    struts2 生成验证码

    在struts2下产生验证码,包含所需要的action(返回的就是验证码图片),struts配置文件,页面的调用。

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

    用struts做一个有验证码的注册页面(适合新手)

    用struts写一个注册页面,适用于新手,初学srutts的,用到了校验器,用到了验证码生成等等

    使用struts2.0实现的验证码功能

    一个使用struts使用struts2.0实现的验证码功能的登录页面,可以方便的生成验证码

    在JSP页面中动态生成图片验证码的方法实例

    在JSP页面中动态生成图片验证码 &lt;&#37;@ page language=java pageEncoding=UTF-8%&gt; &lt;&#37;@ page import=java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.* %&gt; &lt;&#37;@ taglib ...

    FreeMarke实例代码

    FreeMarker允许Java servlet保持图形设计同应用程序逻辑的...FreeMarker同样可以应用于非Web应用程序环境 FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库 FreeMarker是免费的

    登录 单点登录 带验证码登录

    这是一个简单而完整的登录实例,实现单点登录效果,java自动生成图片验证码,访问拦截,没登录时不可以访问会员页面。是一个完整的实例,struts构建,内有jar包。

    struts2.1.8+JPA3.0(hibernate实现)+spring2.5+extjs3.2中型BBS项目

    支持上传图片和文件,文件作为附件可以下载,图片可直接在JSP页面中显示 支持回帖,并在主楼中显示 答辩用PPT 选做部分: 帖子搜索 用户查找 管理员对帖子加精、置顶 根据浏览量,自动在首页生成热门帖子列表...

    JAVA程序开发大全---上半部分

    20.5.4 生成随机验证码的imgNum类 358 20.5.5 用户登录页面index.jsp 359 20.5.6 验证用户登录信息的Servlet类login 360 20.6 显示宠物信息模块的实现 363 20.6.1 对应宠物的实体类User 363 20.6.2 定义对宠物信息...

    Struts 成功测试

    \web\WebRoot\index.jsp 首页 =================================================================== D:\web\WebRoot\include\CSS.CSS D:\web\WebRoot\include\image.jsp 生成验证码的jsp ============...

    达内Java培训项目(当当网/通用电子商务系统)

    技术实现:Struts2、JSP、MySQL、Jquery、Javascript、Ajax 、Json、JUnit 项目描述: 本项目主要实现了用户管理模块、商品分类展示模块、购物车模块、订单模块。 用户管理模块实现了用户注册、实时验证、用户登录...

    当当网全套源码(附带邮箱验证功能)

    Struts2,JDBC(连接池),jQuery,Ajax 2)设计思想 MVC和分层设计思想 a.显示层:JSP组件(jQuery,Ajax) b.控制层:Struts2控制器组件、Action组件 c.业务层:Bean组件 d.数据访问层:DAO组件(JDBC) 4.数据库...

    java开发常用jar包

    struts2-spring-plugin-2.0.14.jar struts2整合spring所需要的包 xwork-2.0.7.jar xwork核心包 antlr-2.7.6.jar 一个语言转换工具, Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包 javassist-3.9.0...

    Java学习笔记-个人整理的

    {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {1.4.1}整数与浮点数}{23}{subsection.1.4.1} {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{...

    Lerx 网站内容管理系统 v5.5.zip

    Lerx CMS V5版(以下简称V5版)采用了基于Java的SpringMVC框架,抛弃了V2-V3版本使用的Struts 2。SpringMVC框架更加安全、稳定。ORM持久化框架依旧使用Hibernate,版本为5.4。开发时采用的数据库为MySQL。是一个能快速...

    JspRun!社区论坛系统 v6.0 bulid 090423 GBK 源码版.rar

    10、修复了生成验证码的访问路径 11、修复了主题操作在某些条件下会出错 12、修复了个人空间显示效果,包括文集、昵称、收藏版块、主题图标等 13、修复了上传图片时如果图片是动画为该图片生成缩略图和水印图片 ...

    JspRun!社区论坛系统 v6.0 bulid 090424 GBK 安装版.rar

    10、修复了生成验证码的访问路径 11、修复了主题操作在某些条件下会出错 12、修复了个人空间显示效果,包括文集、昵称、收藏版块、主题图标等 13、修复了上传图片时如果图片是动画为该图片生成缩略图和水印图片 ...

    iuhyiuhkjh908u0980

    本章我们将会开发基于Struts2框架的Hello World.我们的Hello World程序是你开发基于Struts2框架程序的第一步.这里我们会提供循序渐进的教程来开发基于Struts2框架的Hello World程序. 教程包含基本的步骤像创建目录...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

Global site tag (gtag.js) - Google Analytics