1.web.xml
<!-- 验证码集成 -->
<servlet>
<servlet-name>ValidateCodeServlet</servlet-name>
<servlet-class>
com.xjtu.util.ValidateCodeServlet
</servlet-class>
<init-param>
<param-name>width</param-name>
<param-value>200</param-value>
</init-param>
<init-param>
<param-name>height</param-name>
<param-value>80</param-value>
</init-param>
<init-param>
<param-name>codeCount</param-name>
<param-value>5</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCodeServlet</servlet-name>
<url-pattern>/validateCode.img</url-pattern>
</servlet-mapping>
<!-- 验证码集成 -->
2.com.xjtu.util
package com.xjtu.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ValidateCodeServlet extends HttpServlet {
private final Font mFont = new Font("Arial Black", Font.PLAIN, 15); // 设置字体
private final int lineWidth = 2; // 干扰线的长度=1.414*lineWidth
private final int width = 60; // 定义图形大小
private final int height = 22; // 定义图形大小
private final int count = 200;
/**
* 描述:
*
* @param fc
* 描述:
* @param bc
* 描述:
*
* @return 描述:
*/
private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
final Random random = new Random();
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
final int r = fc + random.nextInt(bc - fc);
final int g = fc + random.nextInt(bc - fc);
final int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
// 处理post
@Override
public void doPost(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* 描述:
*
* @param request
* 描述:
* @param response
* 描述:
*
* @throws ServletException
* 描述:
* @throws IOException
* 描述:
*/
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {
// response.reset();
// 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/gif");
// 在内存中创建图象
final BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
final Graphics2D g = (Graphics2D) image.getGraphics();
// 生成随机类
final Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200, 250)); // ---1
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(mFont);
// 画边框
g.setColor(getRandColor(0, 20)); // ---2
g.drawRect(0, 0, width - 1, height - 1);
// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
for (int i = 0; i < count; i++) {
g.setColor(getRandColor(150, 200)); // ---3
final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
final int y = random.nextInt(height - lineWidth - 1) + 1;
final int xl = random.nextInt(lineWidth);
final int yl = random.nextInt(lineWidth);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(4位数字)
String sRand = "";
for (int i = 0; i < 4; i++) {
final String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.setColor(new Color(20 + random.nextInt(130), 20 + random
.nextInt(130), 20 + random.nextInt(130))); // --4--50-100
g.drawString(rand, (13 * i) + 6, 16);
}
// 将认证码存入SESSION
request.getSession().setAttribute("validateCode", sRand);
// 图象生效
g.dispose();
final java.io.OutputStream os = response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "PNG", os);
os.flush();
os.close();
}
}
3.jsp
<input type="validate" name="validateCode" id="code"
style="height: 18px; width: 130px; border: solid 1px #cadcb2; font-size: 12px; color: #81b432;">
<img height='17' width="55" src="${ctx }/validateCode.img"
οnclick="this.src='${ctx}/validateCode.img?'+Math.random();"
style="cursor: pointer; vertical-align: middle;" />
4.form
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.xjtu.action.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
/**
* MyEclipse Struts
* Creation date: 04-02-2011
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ActionForm {
/*
* Generated fields
*/
/** password property */
private String password;
/** username property */
private String username;
private String validateCode;
/*
* Generated Methods
*/
/**
* Method validate
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}
/**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
/**
* Returns the password.
* @return String
*/
public String getPassword() {
return password;
}
/**
* Set the password.
* @param password The password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Returns the username.
* @return String
*/
public String getUsername() {
return username;
}
/**
* Set the username.
* @param username The username to set
*/
public void setUsername(String username) {
this.username = username;
}
public String getValidateCode() {
return validateCode;
}
public void setValidateCode(String validateCode) {
this.validateCode = validateCode;
}
}
5.action
String validateCode = loginForm.getValidateCode();
String validateCodesession = (String)session.getAttribute("validateCode");
if (userinfo.getPwd().equals(password)&& validateCodesession.equals(validateCode) )
<!-- 验证码集成 -->
<servlet>
<servlet-name>ValidateCodeServlet</servlet-name>
<servlet-class>
com.xjtu.util.ValidateCodeServlet
</servlet-class>
<init-param>
<param-name>width</param-name>
<param-value>200</param-value>
</init-param>
<init-param>
<param-name>height</param-name>
<param-value>80</param-value>
</init-param>
<init-param>
<param-name>codeCount</param-name>
<param-value>5</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCodeServlet</servlet-name>
<url-pattern>/validateCode.img</url-pattern>
</servlet-mapping>
<!-- 验证码集成 -->
2.com.xjtu.util
package com.xjtu.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ValidateCodeServlet extends HttpServlet {
private final Font mFont = new Font("Arial Black", Font.PLAIN, 15); // 设置字体
private final int lineWidth = 2; // 干扰线的长度=1.414*lineWidth
private final int width = 60; // 定义图形大小
private final int height = 22; // 定义图形大小
private final int count = 200;
/**
* 描述:
*
* @param fc
* 描述:
* @param bc
* 描述:
*
* @return 描述:
*/
private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
final Random random = new Random();
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
final int r = fc + random.nextInt(bc - fc);
final int g = fc + random.nextInt(bc - fc);
final int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
// 处理post
@Override
public void doPost(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
/**
* 描述:
*
* @param request
* 描述:
* @param response
* 描述:
*
* @throws ServletException
* 描述:
* @throws IOException
* 描述:
*/
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {
// response.reset();
// 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/gif");
// 在内存中创建图象
final BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
final Graphics2D g = (Graphics2D) image.getGraphics();
// 生成随机类
final Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200, 250)); // ---1
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(mFont);
// 画边框
g.setColor(getRandColor(0, 20)); // ---2
g.drawRect(0, 0, width - 1, height - 1);
// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
for (int i = 0; i < count; i++) {
g.setColor(getRandColor(150, 200)); // ---3
final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
final int y = random.nextInt(height - lineWidth - 1) + 1;
final int xl = random.nextInt(lineWidth);
final int yl = random.nextInt(lineWidth);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(4位数字)
String sRand = "";
for (int i = 0; i < 4; i++) {
final String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.setColor(new Color(20 + random.nextInt(130), 20 + random
.nextInt(130), 20 + random.nextInt(130))); // --4--50-100
g.drawString(rand, (13 * i) + 6, 16);
}
// 将认证码存入SESSION
request.getSession().setAttribute("validateCode", sRand);
// 图象生效
g.dispose();
final java.io.OutputStream os = response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "PNG", os);
os.flush();
os.close();
}
}
3.jsp
<input type="validate" name="validateCode" id="code"
style="height: 18px; width: 130px; border: solid 1px #cadcb2; font-size: 12px; color: #81b432;">
<img height='17' width="55" src="${ctx }/validateCode.img"
οnclick="this.src='${ctx}/validateCode.img?'+Math.random();"
style="cursor: pointer; vertical-align: middle;" />
4.form
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.xjtu.action.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
/**
* MyEclipse Struts
* Creation date: 04-02-2011
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ActionForm {
/*
* Generated fields
*/
/** password property */
private String password;
/** username property */
private String username;
private String validateCode;
/*
* Generated Methods
*/
/**
* Method validate
* @param mapping
* @param request
* @return ActionErrors
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}
/**
* Method reset
* @param mapping
* @param request
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
/**
* Returns the password.
* @return String
*/
public String getPassword() {
return password;
}
/**
* Set the password.
* @param password The password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Returns the username.
* @return String
*/
public String getUsername() {
return username;
}
/**
* Set the username.
* @param username The username to set
*/
public void setUsername(String username) {
this.username = username;
}
public String getValidateCode() {
return validateCode;
}
public void setValidateCode(String validateCode) {
this.validateCode = validateCode;
}
}
5.action
String validateCode = loginForm.getValidateCode();
String validateCodesession = (String)session.getAttribute("validateCode");
if (userinfo.getPwd().equals(password)&& validateCodesession.equals(validateCode) )