动态生成验证码

下面一个实例讲述如何动态生成验证码及验证码是否匹配。

显示验证码的html页面login.html代码如下:
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
  
< head >
    
< title > login.html </ title >
    
    
< meta  http-equiv ="keywords"  content ="keyword1,keyword2,keyword3" >
    
< meta  http-equiv ="description"  content ="this is my page" >
    
< meta  http-equiv ="content-type"  content ="text/html; charset=UTF-8" >
    
    
<!-- <link rel="stylesheet" type="text/css" href="./styles.css"> -->

  
</ head >
  
  
< body >
  
< center >
    
< form  action ="login"  method ="post" >
    验证码:
< input  type ="text"  name ="random" >< img  src ="imgcode" >
    
< br >
    
< br >
    
< input  type ="submit"  value ="提交" >
    
</ form >
   
</ center >
  
</ body >
</ html >
 
动态生成验证码的servlet类RandomCodeServlet.java代码如下:
package  iss;


import  java.awt.Color;
import  java.awt.Font;
import  java.awt.Graphics2D;
import  java.awt.image.BufferedImage;
import  java.util.Random;

import  javax.servlet.ServletException;
import  javax.servlet.ServletOutputStream;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
import  javax.servlet.http.HttpSession;
import  javax.imageio. * ;

public   class  RandomCodeServlet  extends  HttpServlet  {

    
/**
     * Constructor of the object.
     
*/

    
public RandomCodeServlet() {
        
super();
    }

    
    
//验证码图片的宽度
    private int width=60;
    
//验证码图片的高度
    private int height=20;
    
    
protected void service(HttpServletRequest request,HttpServletResponse response)
                              
throws ServletException,java.io.IOException{
        BufferedImage buffImg
=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        Graphics2D g
=buffImg.createGraphics();
        
        
//创建一个随机数生成器
        Random random=new Random();
        
        g.setColor(Color.WHITE);
        g.fillRect(
00, width, height);
        
        
//创建字体,字体的大小应该根据图片的高度来定
        Font font=new Font("Times New Roman",Font.PLAIN,18);
        
//设置字体
        g.setFont(font);
        
        
//画边框
        g.setColor(Color.BLACK);
        g.drawRect(
00, width-1, height-1);
        
        
//随机产生160条干扰线
        g.setColor(Color.GRAY);
        
for(int i=0;i<160;i++){
            
int x=random.nextInt(width);
            
int y=random.nextInt(height);
            
int x1=random.nextInt(12);
            
int y1=random.nextInt(12);
            g.drawLine(x, y, x
+x1, y+y1);
        }

        
        
//randomCode用于保存随机产生的验证码
        StringBuffer randomCode=new StringBuffer();
        
int red=0,green=0,blue=0;
        
        
//随机产生4位数字的验证码
        for(int i=0;i<4;i++){
            
//得到随机产生的验证码数字
            String strRand=String.valueOf(random.nextInt(10));
            
            
//产生随机的颜色分量来构造颜色值
            red=random.nextInt(110);
            green
=random.nextInt(50);
            blue
=random.nextInt(50);
            
            
//用随机产生的颜色将验证码绘制到图像中
            g.setColor(new Color(red,green,blue));
            g.drawString(strRand, 
13*i+616);
            
            randomCode.append(strRand);
        }

        
        
//将四位数字的验证码保存到session中
        HttpSession session=request.getSession();
        session.setAttribute(
"randomCode", randomCode.toString());
        
        
//禁止图像缓存
        response.setHeader("Pragma""no-cache");
        response.setHeader(
"Cache-Control""no-cache");
        response.setDateHeader(
"Expires"0);
        
        response.setContentType(
"image/jpeg");
        
//将图像输出到servlet输出流中
        ServletOutputStream sos=response.getOutputStream();
        ImageIO.write(buffImg, 
"jpeg", sos);
        sos.close();
        
    }


}


判断验证码是否匹配的LoginServlet.java代码如下:
package  iss;

import  java.io.IOException;
import  java.io.PrintWriter;

import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
import  javax.servlet.http.HttpSession;

public   class  LoginServlet  extends  HttpServlet  {

    
/**
     * The doPost method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to post.
     * 
     * 
@param request the request send by the client to the server
     * 
@param response the response send by the server to the client
     * 
@throws ServletException if an error occurred
     * 
@throws IOException if an error occurred
     
*/

    
public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {

        HttpSession session
=request.getSession();
        String randomCode
=(String)session.getAttribute("randomCode");
        
if(null==randomCode){
            response.sendRedirect(
"login.html");
            
return;
        }

        String reqRandom
=request.getParameter("random");
        response.setCharacterEncoding(
"gbk");
        response.setContentType(
"text/html;charset=gb2312");
        PrintWriter out 
= response.getWriter();
        
if(randomCode.equals(reqRandom)){
            out.println(
"验证码匹配!");
        }
else{
            out.println(
"验证码不匹配!");
        }

        
        out.close();
    }


}


web.xml如下:
<? xml version="1.0" encoding="UTF-8" ?>
< web-app  version ="2.4"  
    xmlns
="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
  
< servlet >
    
< description > This is the description of my J2EE component </ description >
    
< display-name > This is the display name of my J2EE component </ display-name >
    
< servlet-name > RandomCodeServlet </ servlet-name >
    
< servlet-class > iss.RandomCodeServlet </ servlet-class >
  
</ servlet >
  
< servlet >
    
< description > This is the description of my J2EE component </ description >
    
< display-name > This is the display name of my J2EE component </ display-name >
    
< servlet-name > LoginServlet </ servlet-name >
    
< servlet-class > iss.LoginServlet </ servlet-class >
  
</ servlet >


  
< servlet-mapping >
    
< servlet-name > RandomCodeServlet </ servlet-name >
    
< url-pattern > /imgcode </ url-pattern >
  
</ servlet-mapping >
  
< servlet-mapping >
    
< servlet-name > LoginServlet </ servlet-name >
    
< url-pattern > /login </ url-pattern >
  
</ servlet-mapping >
</ web-app >
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值