首先当然要导入各种需要的包和jQuery.js
- Action.RandomImg.java
package Action;
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.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* Pic validator
* @author WalkingDog
*
*/
public class RandomImg extends ActionSupport
{
private ByteArrayInputStream inputStream;
public ByteArrayInputStream getInputStream()
{
return inputStream;
}
public void setInputStream(ByteArrayInputStream inputStream)
{
this.inputStream = inputStream;
}
@Override
public String execute() throws Exception
{
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, 255));
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
g.setColor(getRandColor(160, 200));
for(int i = 0; i < 155; i++)
{
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(12);
int y2 = random.nextInt(12);
g.drawLine(x1, y1, x2, y2);
}
String sRand = "";
for(int i = 0; i < 6; i++)
{
String rand = getRandomChar();
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);
}
ActionContext.getContext().getSession().put("randomImg", sRand.toLowerCase());//存进session,用于验证
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);
}
private static String getRandomChar()
{
int rand = (int)Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '\u0000';
switch (rand)
{
case 1:
itmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)itmp;
return String.valueOf(ctmp);
case 2:
itmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)itmp;
return String.valueOf(ctmp);
default :
itmp = Math.round(Math.random() * 9);
}
return String.valueOf(itmp);
}
} - 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><package name="struts2" extends="struts-default"><!-- 验证码图片 --><action name="randomImg" class="Action.RandomImg"><result type="stream"><param name="contentType">image/jpeg</param><param name="inputtName">inputStream</param></result></action></package></struts>
- randomImg.html
<html>
<head>
<title>randomImg.html</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function chageValidateCode()
{
var timenow = new Date().getTime();
$("img.validate").attr("src", "randomImg.action?d="+timenow);
}
</script>
</head>
<body>
validateCode:<input type="text" name="validateCode" size="10"/>
<img class="validate" src="randomImg.action" onclick="chageValidateCode()"/>
</body>
</html>