login.jsp
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
function trim(s)
{
return s.replace(/^\s*/,"").replace(/\s*$/,"");
}
function validate(form)
{
var errStr = "";
var username = trim(form.username.value);
var password = trim(form.password.value);
if(username == "" || username == null)
errStr += "请输入用户名\n";
if(password == "" || password == null)
errStr += "请输入密码\n";
if(vercode == "" || vercode == null)
errStr += "请输入验证码";
if(errStr == "")
return true;
else
{
alert(errStr);
return false;
}
}
//为了使每次生成的验证码不一致,即不让浏览器读缓存,所以需要加上时间戳
function refresh()
{
document.getElementById("authImg").src = "authImg?d=" + new Date().getTime();
}
验证码如图:看不清?单击此处刷新
AuthImg.java:
package authImg;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;
public class AuthImg
{
private static final long serialVersionUID = 1L;
//设置图形验证码中字符串的字体和大小
private ByteArrayInputStream image;//图像
private String str;//验证码
private AuthImg()
{
init();
}
/*
* 取得AuthImg实例
*/
public static AuthImg Instance(){
return new AuthImg();
}
/*
* 取得验证码图片
*/
public ByteArrayInputStream getImage()
{
return this.image;
}
/*
* 取得图片的验证码
*/
public String getString()
{
return this.str;
}
//生成随机颜色
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);
}
//生成服务器响应的服务方法
public void init()
{
int width = 100, height = 18;
//生成一张新图片
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
//在图片中绘制内容
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200, 250));
g.fillRect(1, 1, width - 1, height - 1);
//设定背景色
g.setColor(new Color(102, 102, 102));
g.drawRect(0, 0, width - 1, height - 1);
g.setFont(new Font("Arial Black", Font.PLAIN, 16));
//随机生成线条,让图片看起来更加杂乱
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 155; i++)
{
int x = random.nextInt(width - 1);
int y = random.nextInt(height - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g.drawLine(x, y, x + xl, y + yl);
}
for (int i = 0; i < 70; i++)
{
int x = random.nextInt(width - 1);
int y = random.nextInt(height - 1);
int xl = random.nextInt(12) + 1;
int yl = random.nextInt(6) + 1;
g.drawLine(x, y, x - xl, y - yl);
}
//用于保存系统生成的随机字符串
StringBuffer sRand = new StringBuffer(6);
for (int i = 0; i < 6; i++)
{
String tmp = getRandomChar();
sRand = sRand.append(tmp);
//将系统生成的随机字符添加到图形验证码图片上
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(tmp, 15 * i + 10, 15);
}
//赋值验证码
this.str = sRand.toString();
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 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);
}
}
}
action:
package action;
import java.io.ByteArrayInputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import authImg.AuthImg;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class CreateCodeImg extends ActionSupport
{
private static final long serialVersionUID = 1L;
public void setInputStream(ByteArrayInputStream inputStream)
{
this.inputStream = inputStream;
}
public ByteArrayInputStream getInputStream()
{
return inputStream;
}
public String execute() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
//阻止生成页面被缓存,保证每次重新生成随机验证码
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
AuthImg authImg = AuthImg.Instance();
// 取得带有随机字符串的图片
setInputStream(authImg.getImage());
// 取得随机字符串放入HttpSession
ActionContext.getContext().getSession().put("authImg", authImg.getString());
return SUCCESS;
}
private ByteArrayInputStream inputStream;
}
struts.xml部分
image/jpeg
inputStream
部署后,进入login.jsp出现
20:43:46,389 DEBUG SessionImpl:248 - opened session at timestamp: 12526730262
2009-9-11 20:43:50 org.apache.catalina.core.ApplicationContext log
信息: Marking servlet img as unavailable
2009-9-11 20:43:50 org.apache.catalina.core.StandardWrapperValve invoke
严重: Allocate exception for servlet img
java.lang.IllegalAccessException: Class org.apache.catalina.core.StandardWrapper can not access a member of class authImg.AuthImg with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1116)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527)
at java.lang.Thread.run(Unknown Source)
请帮忙