`

页面中验证码的生成总结(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中生成验证码可以帮助提升网站的安全性,防止恶意注册、自动登录和其他攻击。 生成验证码主要涉及以下几个步骤: 1. **安装库**:首先,我们需要一个验证码生成库。例如,我们可以使用Apache Commons ...

    struts2生成中文验证码的Action

    在Struts2中,Action是核心组件,负责处理用户请求并返回相应的结果。在这个特定的场景中,我们讨论的是如何在Struts2中创建一个能够生成中文验证码的Action。 验证码的主要目的是防止自动机器人或恶意攻击,通过向...

    struts2 生成验证码

    3. **Action**:在Struts2中负责处理业务逻辑,并响应用户请求的类。 4. **配置文件**:Struts2使用配置文件来定义项目的结构和组件。 5. **Servlet API**:一组Java接口,用于处理HTTP请求和响应。 #### 三、技术...

    struts2-生成图片验证码

    在Struts2中实现这个功能,我们需要以下步骤: 1. **创建验证码类(CaptchaAction)**: 首先,我们需要创建一个Action类,负责生成和验证验证码。这个类将包含一个方法来生成随机字符串,并将其保存在session中,同时...

    Struts2验证码

    以下将详细讲解如何在Struts2中创建前端注册验证码。 首先,验证码的实现通常包括两个主要部分:后端生成验证码和前端展示及验证。 1. **后端生成验证码** 后端通常使用Java来生成随机的数字或字母组合。你可以...

    基于struts2的验证码生成

    基于Struts2的验证码生成就是将这一功能集成到Struts2框架中的过程。 验证码的主要目的是验证用户是人类而非机器,通常通过显示一个随机生成的图像,要求用户输入图像中显示的字符来实现。在基于Struts2的验证码...

    struts2图片验证码--struts2图片验证码-(通用版)

    Struts2框架提供了丰富的功能来集成这样的安全特性,本文将详细解析如何在Struts2项目中实现一个通用版的图片验证码。 #### 二、技术栈与环境 - **框架**:Struts2 - **语言**:Java - **平台**:J2EE - **工具**...

    struts中实现验证码

    当用户提交表单时,Struts2会将输入框中的验证码与服务器端生成的验证码进行比较。如果匹配,验证通过,否则返回错误信息提示用户重新输入。 通过以上步骤,Struts2框架能够提供一个完整的验证码解决方案,确保了...

    struts2实现验证码

    在Struts2中实现验证码,我们通常会涉及以下几个关键步骤: 1. **生成验证码**:创建一个Java类,用于生成随机的字符串或数字。这个类可能包含一个方法,返回一个指定长度的字符串,例如包含4位数字。我们可以使用...

    Struts验证码插件 JCaptcha4Struts2

    1. **安装和配置**:在Struts2应用中,你需要将JCaptcha4Struts2的依赖库加入到项目中,并在Struts2的配置文件(通常为struts.xml)中进行相应的配置,比如定义验证码拦截器。 2. **生成验证码**:在需要验证码的...

    java登录验证码生成代码

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

    Extjs4登录功能+验证码+struts2

    总结起来,"Extjs4登录功能+验证码+struts2"涉及到的知识点有: 1. ExtJS4的表单组件和布局:如何使用`Ext.form.Panel`、`Ext.form.field.Text`和`Ext.button.Button`创建登录表单。 2. 验证码实现:前端展示和后端...

    Struts2验证码用户登录

    Struts2验证码用户登录是一个常见的...总的来说,Struts2验证码用户登录的实现涉及了后端验证码生成、session存储、前端JavaScript交互以及Struts2的MVC架构。理解并掌握这一过程,对于开发安全的Web应用程序至关重要。

    ajax无页面刷新验证、struts结构+ajax+验证码jsp页面

    总结来说,"ajax无页面刷新验证、struts结构+ajax+验证码jsp页面"这个主题探讨了如何在Struts2框架下利用Ajax技术实现验证码的无刷新更新和验证,为用户提供更流畅的交互体验,同时也增加了应用的安全性。...

    struts2验证码

    在Struts2中,验证码的实现通常涉及到以下几个关键知识点: 1. **Action类**:在Struts2中,Action类是处理用户请求的核心组件。你需要创建一个专门的Action类来处理验证码的生成和验证。这个类通常会包含两个方法...

    基于java的Struts验证码插件 JCaptcha4Struts2.zip

    2. **Struts2拦截器(Interceptor)**:在Struts2中,拦截器是处理请求的关键组件。JCaptcha4Struts2通过一个特定的拦截器来检查用户提交的验证码是否正确,如果验证失败,会阻止请求的进一步处理,并返回错误信息。...

    基于struts1.x的验证码实现

    总结来说,基于Struts1.x的验证码实现是Web开发中的重要环节,它涉及到服务器端的生成、存储、验证,以及客户端的显示和用户交互。通过合理的验证码设计和实现,可以显著提高Web应用程序的安全性,保护用户的账户不...

    基于Java的Struts验证码插件 JCaptcha4Struts2.zip

    首先,`JCaptcha4Struts2`依赖于`JCaptcha`库,这是一个Java实现的开源验证码生成器。`JCaptcha`提供了一种生成复杂图像验证码的方法,该验证码包含随机文本,通常需要用户在提交表单时输入以验证其为人而非机器。...

    struts2 图片 验证码

    在Struts2中实现图片验证码功能是常见的需求,主要用于防止恶意自动化程序(如机器人)对网站进行攻击或滥用。下面我们将深入探讨如何在Struts2框架中创建和使用图片验证码。 首先,验证码的基本原理是生成一段随机...

    struts2+spring3验证码登录实例

    在Struts2中,你可以创建一个专门处理登录请求的Action类,这个类通常会注入Spring管理的业务服务。当用户提交登录表单时,Action会接收到请求,验证用户名、密码以及验证码的正确性。验证码通常会通过Session存储,...

Global site tag (gtag.js) - Google Analytics