当前位置: 代码迷 >> Web前端 >> webwork登录验证码的兑现
  详细解决方案

webwork登录验证码的兑现

热度:103   发布时间:2012-08-29 08:40:14.0
webwork登录验证码的实现

不说废话了,直接上代码,是我在网上找到的,自己整理的。呵呵。

jsp:

<input type="text" name="random" size="5" value=""/><img src="rand.action" onclick="changeValidateCode(this)" title="点击图片刷新验证码"/>

?

js:

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

?

这里说个小插曲,由于我的系统用到了拦截器Interceptor,所有在调用rand.action的时候一直被拦截,结果我在配置文件里面删除了对这个aciton的拦截,就可以顺利运行那个rand的aciton。

?

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;

import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionSupport;

  
public class RandomPictureAction extends ActionSupport {   
  
    private static final long serialVersionUID = -6950908478971552308L;      
    private ByteArrayInputStream inputStream;    
    String str;
         
    public String execute() throws Exception {   
           
      // 在内存中创建图象      
       int width = 65, 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 < 4; 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);   
        //this.getRequest().setAttribute("rand", sRand);   
        this.str = sRand;   
        System.out.println("rand="+sRand);   
        // 图象生效      
        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 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;      
    }      
     
    public ByteArrayInputStream getInputStream() {      
        return inputStream;      
    }

	/**
	 * @return the str
	 */
	public String getStr()
	{
		return str;
	}

	/**
	 * @param str the str to set
	 */
	public void setStr(String str)
	{
		this.str = str;
	}   
}  

?

?

相应的xwork配置文件:

 	<!--用户登陆――验证码-->
    <action name="rand" class="com.payeasy.merchantmanage.action.RandomPictureAction">    
        <result name="success" type="stream">  
        <param name="contentType">image/jpeg</param>     
        <param name="inputName">inputStream</param>  
        </result>  
        <interceptor-ref name="loginStack"/>  
    </action> 

?

最后在提交的登录验证处理类上写入对验证码的校验即可:

			//	取得session保存中的验证码字符串	
			String arandom=(String)(ActionContext.getContext().getSession().get("rand"));
			if(arandom.equals(this.getRandom()))
			{
				vPass = "Y";
			}

?