structs2.3.4 学习笔记(3) 生成图片验证码

以下使用struts2.3.4生成的图片验证码的代码(生成验证大码的代码来源于网络):

1.Action中的代码,主要是 createImage 方法。

package com.buy.user;

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.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

import com.opensymphony.xwork2.ActionContext;

public class UserAction {

	private ByteArrayInputStream inputStream; 
	
	public ByteArrayInputStream getInputStream() {
		return inputStream;
	}

	public void setInputStream(ByteArrayInputStream inputStream) {
		this.inputStream = inputStream;
	}

	public String add(){
		return "success";
	}
	
	/** 
     * 生成随机颜色 
     * @param fc    前景色 
     * @param bc    背景色 
     * @return  Color对象,此Color对象是RGB形式的。 
     */   
    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 String createImage() {
//      在内存中创建图象  
        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);  
        }  
//       将认证码存入SESSION  
        ActionContext.getContext().getSession().put("rand",sRand);  
//       图象生效  
        g.dispose();  
        ByteArrayOutputStream output = new ByteArrayOutputStream();  
        ImageOutputStream imageOut = null;
		try {
			imageOut = ImageIO.createImageOutputStream(output);
			ImageIO.write(image, "JPEG", imageOut);  
	        imageOut.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
          
        ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());  
        this.setInputStream(input); 
        
       
        
        return "success";
	}
	
	public String validate(){
		
		String  strv = (String)ActionContext.getContext().getSession().get("rand");//获取图片的验证码
		System.out.println("strv = " + strv);//在这里可以验证手动输入的验证与图片的验证是否相同
		return "success";
	}
}

2.  struts.xml中的配置如下。

<action name="getValidateImage" class="com.buy.user.UserAction" method="createImage">   
 			<result type="stream">  
               			<param name="contentType">image/jpeg</param>  
               			<param name="inputName">inputStream</param>  
        		</result>    
</action>
 

3. jsp 页面中应如下调用

<label class="img">
     <img style="cursor:pointer;width:100px;height:26px;" alt="" onclick="changeValidateCode(this)" ver_colorofnoisepoint="#888888"   id="JD_Verification1" src="getValidateImage.action"> 
</label>

<label class="ftx23">
      &nbsp;看不清?<a href="javascript:void(0)" onclick="changeValidateCode(this)"  class="flk13">换一张</a>
</label>

   javascript的代码如下:

function changeValidateCode(obj) {  
      
     	//这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。"nocache="+new Date().getTime() 
     	document.getElementById("JD_Verification1").src=document.getElementById("JD_Verification1").src + "?nocache="+new Date().getTime();  
             
 } 

4. 提交按钮的jsp页面代码,xml配置 ,javascript代码.(也就是验证手动输入验证码是否正确)

<form name="testff" id="formpersonal21" action="test.do" method="post" onclick="check()" >
	<input type="button" value="同意以下协议,提交" >
</form>
function check(){
         document.getElementById("formpersonal21").submit();
         return true;
}
<action name="test" class="com.buy.user.UserAction" method="validate">   
 	<result>test.jsp</result>    
</action>
 

猜你喜欢

转载自zxsqi.iteye.com/blog/1597263