Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

图片验证码

Posted on 2009-05-25 23:19 啥都写点 阅读(457) 评论(0)  编辑  收藏 所属分类: J2SE
   这里介绍一个简单struts2的验证码程序:
package com.yan;

import java.io.ByteArrayInputStream;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;


/**
 * 输出验证码的Action
 * 
@author Billy
 
*/
public class RandomAction{

    
    
private static final long serialVersionUID = -540011645418859040L;
    
    
private ByteArrayInputStream inputStream;
    

    
public ByteArrayInputStream getInputStream() {
        
return inputStream;
    }

    
public void setInputStream(ByteArrayInputStream inputStream) {
        
this.inputStream = inputStream;
    }
    
    
public String execute()  {
        
    RandomNumUtil rdnu
=RandomNumUtil.Instance(); 
      
    
this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片 
        
     ActionContext.getContext().getSession().put(
"VerificationCode", rdnu.getString());//取得随机字符串放入HttpSession 

    
return Action.SUCCESS;
    }
}



package com.yan;

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 static int width = 60;// 验证码图片的长度
    private static int height = 20// 验证码图片的高度
    private static int number = 4;// 验证码的位数

    
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() {
        
// 在内存中创建图象

        BufferedImage image 
= new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        
// 获取图形上下文
        Graphics g = image.getGraphics();
        
// 生成随机类
        Random random = new Random();
        
// 设定背景色
        g.setColor(getRandColor(200250));
        g.fillRect(
00, width, height);
        
// 设定字体
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160200));
        
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 < number; 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 + 616);
        }
        
// 赋值验证码
        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);
    }

}

struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"/>
     
<package name="ryan" extends="struts-default">
        
<action name="random" class="com.yan.RandomAction">
          
<result type="stream">     
             
<param name="contentType">image/jpeg</param>     
             
<param name="inputName">inputStream</param>     
        
</result>  
        
</action>
  
   
<action name="phoenix" class="com.yan.PhoenixAction">
     
<result name="input">/identifying.jsp</result>   
     
<result name="success">/success.jsp</result>  
   
</action>
   
        
    
</package>
</struts>
 

页面
<%@ page language="java"  pageEncoding="utf-8"%>
<%
String path 
= request.getContextPath();
String basePath 
= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
     
<script type="text/javascript">
      function changeValidateCode(obj) {   
               
//获取当前的时间作为参数,无具体意义   
            var timenow = new Date().getTime();   
               
//每次请求需要一个不同的参数,否则可能会返回同样的验证码   
            
//这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。   
            obj.src="random.action?d="+timenow;   
        }
     
     
</script>
  
</head>
  
  
<body>
    
<s:fielderror></s:fielderror>
     
<s:form action="phoenix">     
     
<s:textfield name="inputCode" id="inputCode" cssStyle="width:81px"/><img src="random.action" onclick="changeValidateCode(this)" title="点击图片刷新验证码"/><br>
     
<s:submit value="submit"></s:submit>
     
</s:form>
     
     
  
</body>
</html>




                                                                                                       --    学海无涯
        


只有注册用户登录后才能发表评论。


网站导航: