apache+tomcats     session   问题

apache+tomcats     session   问题

使用apache2.2.4、tomcat6.0和mod_jk-apache-2.2.4.so进行整合。都是通过虚拟主机访问我得一个项目,测试时发现进入不了项目了,原因为使用了图片生成验证码,信息放在session中了,我的图片生成验证码使用的是jsp内嵌java代码的形式,生成验证码后保存到session中,可是到程序中验证的时候,在session中取出验证码总是空的,导致验证总是不成功。这个程序如果只使用tomcat,就没有任何问题的。
生成图片的页面代码为:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %> <%!
//生成随机颜色
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);
}
%> <%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);


// 设置图片的长宽
int width=60, height=20;
//设置备选汉字,剔除一些不雅的汉字
String base = "23456789abcdefghjkmnpqrstuvwxyz";
//备选汉字的长度
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,50,100));
g.setFont(new Font("Times New Roman",Font.PLAIN,0));


for (int i=0;i <6;i++)
{
g.drawString("----------------------------------------",0,3*(i+2));
}


//取随机产生的认证码(6个汉字)


//保存生成的汉字字符串
String sRand="";
for (int i=0;i <4;i++)
{
int start = random.nextInt(length);
String rand=base.substring(start,start+1);
sRand+=rand;

//设置字体的颜色
g.setColor(getRandColor(random,10,150));
//设置字体normal
//g.setFont(new Font(fontTypes[2],Font.normal,20);
g.setFont(new Font(fontTypes[4],Font.BOLD,16));
//将此汉字画到图片上
g.drawString(rand,15*i+2,16);

}


//将认证码存入session
session.setAttribute("rechargeRand",sRand);
//System.out.println("srand="+sRand);

g.dispose();


//输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>
------------------------------------------------------------------------------
程序中获取验证码的代码为:

// 获取验证码

String rechargeRand = (String) request.getSession().getAttribute("rechargeRand");
if ((null == rechargeRand)|| !rechargeRand.equals(loginForm.getCheckNode()))
{

request.setAttribute("errorTitle", StringTitle.CLIENT_LOGIN_FAILED);
errors.add(ResultString.CHECK_CODE_ERROR);
request.setAttribute("errors", errors);
return false;
}
呵呵,典型的问题吧。

1 你的验证码是在页面已经生成之后才有的
2 所以你应该页面提交页面,去验证页面上刚刚生成的验证码

不要直接使用,你会发现
第一次总是null
第二次总是上一次的验证码