这里是用struts2 ,继承了struts2 里的Rrsult类,使用时自定义一个返回结果即可:
<result-types>
<result-type name="imageResult" class="生成验证码的类" />
</result-types>
action方法里面什么都不需要写,直接返回success即可
<action name="image" class="com.hzdracom.action.AdminManagerAction" method="createRand">
<result type="imageResult" name="success"></result>
</action>
当然,也可以用其它方法调用该类,使其把生成的验证码图片显示到页面上即可,
验证码生成类:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
public class ImageResult implements Result {
public void execute(ActionInvocation invocation) throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
// 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 设置图片的长宽
int width = 176, height = 30;
// 设置备选汉字,剔除一些不雅的汉字 这里只说明,省略具体汉字
String base = "\u7684\u4e00\u4e86\u662f\u6211 。。。省略汉字。。。;
// 备选汉字的长度
int length = base.length();
// 创建内存图像
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 创建随机类的实例
Random random = new Random();
// 设定图像背景色(因为是做背景,所以偏淡)
g.setColor(getRandColor(random, 200, 250));
g.fillRect(0, 0, width, height);
// 备选字体
String[] fontTypes = { "\u5b8b\u4f53", "\u65b0\u5b8b\u4f53",
"\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66" };
int fontTypesLength = fontTypes.length;
// 在图片背景上增加噪点
g.setColor(getRandColor(random, 160, 200));
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
for (int i = 0; i < 6; i++) {
g.drawString("*********************************************", 0,
5 * (i + 2));
}
// 取随机产生的认证码(6个汉字)
// 保存生成的汉字字符串
String sRand = "";
for (int i = 0; i < 6; i++) {
int start = random.nextInt(length);
String rand = base.substring(start, start + 1);
sRand += rand;
// 设置字体的颜色
g.setColor(getRandColor(random, 10, 150));
// 设置字体
g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],
Font.BOLD, 18 + random.nextInt(6)));
// 将此汉字画到图片上
g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);
}
// 将认证码存入session
// 将认证码存入SESSION
ServletActionContext.getRequest().getSession().setAttribute("rand",
sRand);
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
}
// 生成随机颜色
Color getRandColor(Random random, int fc, int bc) {
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);
}
}