附1:jsp验证码详解

JSP页面末尾要添加以下两行,不行会报错:
java.lang.IllegalStateException: getOutputStream() has already been called for this response       
out.clear();
out = pageContext.pushBody();


jsp验证码生成以及刷新

关于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.xml配置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中的是否一致就可以了

你可能感兴趣的:(jsp)