Servlet生成随机验证码

来源:互联网 发布:淘宝店铺详情图片尺寸 编辑:程序博客网 时间:2024/05/19 20:57

Servlet部分:

package servlet;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class CreateImage extends HttpServlet {

String width;
String height;

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

   //生成4位数字随机数
   int randnumber=(int)Math.floor(Math.random()*10000);
   String rand=String.valueOf(randnumber);
   switch(rand.length()){
    case 1: rand = "000"+rand; break;
     case 2: rand = "00"+rand; break;
     case 3: rand = "0"+rand; break;
     case 4: break;
   }
  
   //生成图象
   try {
    response.setContentType("image/jpeg");
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);

    BufferedImage image = new BufferedImage(Integer.parseInt(width), Integer.parseInt(height),
      BufferedImage.TYPE_INT_RGB);

    // 获取图形上下文
    Graphics g = image.getGraphics();

    // 设定背景色
    g.setColor(Color.white);
    g.fillRect(0, 0, Integer.parseInt(width), Integer.parseInt(height));

    // 将认证码显示到图象中
    g.setColor(Color.black);
    g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
    g.drawString(rand, 15, 16);

    // 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
    Random random = new Random();
    for (int i = 0; i < 88; i++) {
     int x = random.nextInt(Integer.parseInt(width));
     int y = random.nextInt(Integer.parseInt(height));
     g.drawLine(x, y, x, y);
    }

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

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

    // 以下关闭输入流!
    responseOutputStream.flush();
    responseOutputStream.close();
   
    //随机数字放到session
    request.getSession().setAttribute("randNumber", rand);
   
   } catch (Exception e) {
    e.printStackTrace();
   }
}

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

/**
   * @function: 初试化方法,得到xml配置文件中数值
   */
public void init() throws ServletException {
   width=getInitParameter("width");
   height=getInitParameter("height");
}
}

xml配置部分:

<!-- 随即生成验证数字 -->
<servlet>
   <servlet-name>picShow</servlet-name>
   <servlet-class>servlet.CreateImage</servlet-class>
  
   <init-param>
    <param-name>width</param-name>
    <param-value>60</param-value>
   </init-param>
   <init-param>
    <param-name>height</param-name>
    <param-value>22</param-value>
   </init-param>  
</servlet>
<servlet-mapping>
   <servlet-name>picShow</servlet-name>
   <url-pattern>/imageShow</url-pattern>
</servlet-mapping>

页面调用部分:

<img src="imageShow" />