动态生成验证码

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

显示验证码的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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值