码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2返回验证码

时间:2014-07-16 20:40:37      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:java   color   strong   文件   os   width   

配置struts.xml文件

<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 将value改成true 当访问action的时候调用Action类默认不执行execute方法

如果是false的话哪么调用action执行execute方法

<package name="default" namespace="/" extends="struts-default"> namespace:是访问action的前缀  extends:可以继承其他包  name:包的名字

<action name="ValidateBar" class="net.dbet.action.ValidateBarAction"method="download">

name:action的名字 class:当访问action的时候默认执行一个Action类 method:调用这个类中执行的方法

    <result name="down" type="stream"> action调用的Action类中的方法默认返回的值 自动匹配对应相同的result name type:以流的方式返回         

       指定下载文件的格式为jpg:<param name="contentType">image/jpg</param>

       <param name="contentType"> application/octet-stream </param>   无论上传什么文件都下载对应的格式文件

       <param name="inputName">downloadfile</param>    downloadfile对应的net.dbet.action.FileOploadAction中的sownload方法中的downloadfile对象    

    </result>                                                               

</action>

</package>

 

 

创建Jsp页面

<body>

    <image src="ValidateBar"></image>  //路径是一个action

</body>

 

 

创建Action类

package net.dbet.action;

 

import java.io.FileInputStream;

 

import net.dbet.util.ValidateBarUtil;

 

import org.apache.struts2.ServletActionContext;

 

import com.opensymphony.xwork2.ActionContext;

 

public class ValidateBarAction {

    private InputStream downloadfile;   与<param name="inputName">downloadfile</param>中的downloadfile一致

    public InputStream getDownloadfile() {

       return downloadfile;

    }

    public String download(){

       try {

           this.downloadfile=ValidateBarUtil.createAsStream(ActionContext.getContext().getSession());

//调用ValidateBarUtil类中的createAsStream方法传递过去当前的session会话

       } catch (Exception e) {

           e.printStackTrace();

       }

       return "down";

    }

}

 

创建ValidateBarUtil类

package net.dbet.util;

 

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.io.InputStream;

import java.util.Map;

import java.util.Random;

 

import javax.imageio.ImageIO;

 

public class ValidateBarUtil {

    public static InputStream createAsStream(Map session)

    {

       return new ByteArrayInputStream(create(session));

    }

    public static byte[] create(Map session) {// 在内存中创建图象

       int width = 60, height = 20;   //定义图像宽度高度

       BufferedImage image = new BufferedImage(width, height,

               BufferedImage.TYPE_INT_RGB);  //将生成的图片存到BufferedImage里

 

       // 获取图形上下文

       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));

 

       // 画边框

       // g.setColor(new Color());

       // g.drawRect(0,0,width-1,height-1);

 

       // 随机产生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);

       }

 

       // 取随机产生的认证码(4位数字)

       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

       session.put("ValidateBar",sRand);

 

       // 图象生效

       g.dispose();

       // 输出图象到页面

       ByteArrayOutputStream baos=new ByteArrayOutputStream(); //创建一个字节数组

       try {

           ImageIO.write(image, "JPEG",baos);  //将画出的图像写到byte数组中

       } catch (IOException e) {

          

           e.printStackTrace();

       }

      

       return baos.toByteArray();

    }

 

    public static 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);

    }

}

Struts2返回验证码,布布扣,bubuko.com

Struts2返回验证码

标签:java   color   strong   文件   os   width   

原文地址:http://www.cnblogs.com/gdds/p/3836600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!