关于jsp验证码生成,显示,验证和刷新:

1:四位数据的验证图片生成,用servlet实现

2: 在web.xmlli配置servlet

3:页面上显示servlet生成的图片

4: 关于验证码输入数据的验证

5: 验证码的刷新

——————————————————————–

1:四位数据的验证图片生成,用servlet实现,servlet代码如下:
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;

import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;

public class vImage extends HttpServlet {
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType(”image/jpeg”);
res.setHeader(”Pragma”, “No-cache”);
res.setHeader(”Cache-Control”, “no-cache”);
res.setDateHeader(”Expires”, 0);
HttpSession session = req.getSession();

// 在内存中创建图象
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 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);
}
}

2: 在web.xmlli配置servlet:

vImage
/vimage

注:注意元素在web.xml文件里的位置

3:页面上显示servlet生成的图片:


注:在需要显示验证码的地方加上这句,name在刷新验证码的时候会用到。

4: 关于验证码输入数据的验证:

验证码生成时存入了session,就是servlet里的这句session.setAttribute(”post_validate_code”, sRand);具体验证就不多说了。
5: 验证码的刷新
刷新验证码

function reloadImage(url)
{
document.form名字.pic.src = url;
}

前两个有时间参考

//

证实好用的:只一个单纯的jsp 页面直接粘过去即可。

<%@ page   
         import = "java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>   
<%@ page import = "java.io.OutputStream" %>   
<%@ page pageEncoding= "UTF-8" %>   
<%!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);   
        }%>   
<%   
                 try {   
                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);   
                OutputStream os = response.getOutputStream();   
                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(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);   
                }   
                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.setAttribute( "rand" , sRand);   
                g.dispose();   
  
                ImageIO.write(image, "JPEG" , os);   
                os.flush();   
                os.close();   
                os = null ;   
                response.flushBuffer();   
                out.clear();   
                out = pageContext.pushBody();   
        } catch (IllegalStateException e) {   
                System.out.println(e.getMessage());   
                e.printStackTrace();   
        }   
%>   

///

jsp验证码的使用实例

关键字: jsp

在网上找了哈相关的代码 其大多都没有注释

为了方便学习特意整理了一分带注释的验证码的代码


    生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)

产生验证码图片的文件-----image.jsp

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
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);


// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());


%>

---------------使用验证码图片的文件---------a.jsp------------------------------------

<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>认证码输入页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系统产生的认证码:</td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>输入上面的认证码:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交检测"></td>
</tr>
</form>
</body>
</html>

-----------------验证的页面----------

验证根据需要 直接判断request中的验证码和session中的是否一致就可以了