image.jsp:<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="gbk" %>
<%!
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);
         }
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);// 在内存中创建图象
int width=60, height=20;
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(0, 0, width, height);//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
         int x = random.nextInt(width);
         int y = random.nextInt(height);
         int xl = random.nextInt(12);
         int yl = random.nextInt(12);
         g.drawLine(x,y,x+xl,y+yl);
}// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
     String rand=String.valueOf(random.nextInt(10));
     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);
}// 将认证码存入SESSION
session.setAttribute("rand",sRand); String str=(String)session.getAttribute("rand");// 图象生效
g.dispose();// 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out=pageContext.pushBody();
out.print(str+"-");//有问题------------------------------------有问题------
%>
这是生成验证码以及把验证码存入图片的jsp页面、
// 将认证码存入SESSION
session.setAttribute("rand",sRand); 
我在登录的jsp页面中获取生成四位的随机数如下:
String rand=request.getAttribute("rand") ;
然后写了个JS函数来判断文本框输入的验证码和获取的验证码是否相同、不同则弹出验证码错误、结果获取的验证码(String rand=request.getAttribute("rand") )与image.jsp中生成验证码存入图片的不一样、、例如:
// 将认证码显示到图象中
     g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
     g.drawString(rand,13*i+6,16);
}// 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out=pageContext.pushBody();
登录jsp
  <%   
      String yzm = request.getParameter("yzm");//yzm是获取文本框中
  String rand = (String) session.getAttribute("rand"); 
   %>
<script type="text/javascript">
 function ss(){ 
    if(yzm!=rand) 
    alert("验证码错误!");
  }
</script>    
不管怎么弄yzm和rand就不同即使输入与随机生成的验证码一样也会弹出验证码错误!
希望大家帮忙解决!

解决方案 »

  1.   

    JavaScript能使用java的变量吗?
    你可以给2个<input type="hidden" id="t1" value="<%=(String) session.getAttribute("rand");%>" />
    类似这样的隐藏域赋值,然后通过js取得他们的值去比较。
      

  2.   

    按一楼说的吧,或者<%= %>
      

  3.   

    哥们、、、还是不行...不论我验证码填正确了,还是没正确、他都弹出、验证码错误!并且提交到ACTION
      

  4.   

    验证码的验证应该是在服务器端进行的,若用js,起码得用ajax吧,否则都在客户端了,还有验证的必要吗,很容易就可以规避了