天天看点

彩色验证码

以前,写一个页面的彩色验证码时,从网上找到几个有关于彩色验证码的代码,虽然可以用,但是总会在控制台出错,报异常:java.lang.IllegalStateException。

后来找了相关资料。更改了一小部分代码,在最后加上:

    output.flush();

    out.clear();

这样就能正常了。

整个image.jsp页面代码:

===============================================================================

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>" target="_blank" rel="external nofollow" >
   
    <title>image page</title>
   
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
   

  </head>
 
  <body>
        <%@ page contentType="image/jpeg" import="java.awt.*,
        java.awt.image.*,java.util.*,javax.imageio.*,java.io.OutputStream" %>
        <%!
        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="";
        String randString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        for (int i=0;i<4;i++){
        	//String rand=String.valueOf(random.nextInt(10));
            String rand = String.valueOf(randString.charAt(random.nextInt(61)));
            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);
       
        // 图象生效
        g.dispose();
       
        // 输出图象到页面
        OutputStream output=response.getOutputStream();
        ImageIO.write(image, "JPEG", output);
        output.flush();
        out.clear();
        out = pageContext.pushBody();
        %>
  </body>
</html>
           

=============================================================================

login.jsp

验证码的调用:

<div>
     验证码:<input type="text" name="randCode" maxlength="4" value="" size="4">
     <span><img id="imgCode"  src="../image.jsp" style="cursor:pointer;" οnclick="changeImg()"/></span>
     <span><a href="javascript:void(0)" target="_blank" rel="external nofollow"  οnclick="changeImg()">看不清,换一张</a></span>
</div>
           

 看不清,换一张 的JS代码

<script type="text/javascript" language="javascript">
function changeImg(){
	var img =document.getElementById("imgCode");
	img.src=img.src+"?";
}

</script>
           

==============================================================================

 后台验证代码片段:

//进行验证码检验
        String image=userForm.getImage();
        //得到session中的验证码
        String rand=(String)httpSession.getAttribute("rand");
        if(rand.equals(image)){
          //正确
        }
        else{
           //不正确
        }
           

前台实现的效果演示图:

彩色验证码