[转]java生成并更换验证码(字母和数字)

本文介绍了一个使用Servlet生成包含随机数字和字母的验证码的方法。通过Java AWT库创建图像,并利用Random类生成随机字符,最终将验证码图片输出到客户端。此外,还提供了一种刷新验证码图片的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 用Servlet生成随机数字或字母验证码

 

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

import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;


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


public class RandomCode extends HttpServlet {

 /**
  * The doGet method of the servlet. <br>
  *
  * This method is called when a form. has its tag value method equals to get.
  *
  * @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 doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

           this.doPost(request, response);
 }

 /**
  * 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 {

 //  验证码图片的宽度。
  int width =  70;
  //验证码图片的高度。
  int height=36;
  BufferedImage buffImg=new BufferedImage(width,height,
    BufferedImage.TYPE_INT_RGB);
  Graphics2D g=buffImg.createGraphics();

  //创建一个随机数生成器类。
  Random random=new Random();

   // 设定图像背景色(因为是做背景,所以偏淡)
  g.setColor(getRandColor(180, 250));
  g.fillRect(0,0,width,height);
  //创建字体,字体的大小应该根据图片的高度来定。
  Font font=new Font("Times New Roman",Font.PLAIN,28);
  //设置字体。
  g.setFont(font);

  //画边框。
  g.setColor(Color.BLACK);
  g.drawRect(0,0,width-1,height-1);
//  随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
  g.setColor(Color.GRAY);
      for (int i=0;i<50;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);
  }


  //randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
  StringBuffer randomCode=new StringBuffer();
  
   // 设置默认生成4个验证码
  int length = 4;
//   设置备选验证码:包括"a-z"和数字"0-9"
    String base = "abcdefghijklmnopqrstuvwxyz0123456789";
       
    int size = base.length();
 

  //随机产生4位数字的验证码。
  for (int i=0;i<length;i++) {
   //得到随机产生的验证码数字。
    int start = random.nextInt(size);
    String strRand = base.substring(start, start + 1);
     

   //用随机产生的颜色将验证码绘制到图像中。
//   g.setColor(new Color(red,green,blue));
    // 生成随机颜色(因为是做前景,所以偏深)
   g.setColor(getRandColor(1, 100));
   g.drawString(strRand,13*i+6,28);

   //将产生的四个随机数组合在一起。
   randomCode.append(strRand);
  }
  //将四位数字的验证码保存到Session中。
  HttpSession session=request.getSession();
  session.setAttribute("rand",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();

 }
 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);
  }

}

 

二 在页面上使用(可更换)

 

1、login.jsp中与验证码相关的代码:
-------------------------------------------------------------------------脚本部分-----------------------------------------
   <script type="text/javascript">
   function changeImg()
   {    document.getElementById("validatecodeimg").src=Math.round(Math.random()*10000)+".RandomCode
";
   }
</script>
-------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------验证码图片部分-------------------------------------
<img id="validatecodeimg" alt="" src="first.RandomCode " align="top">  
<a href="javascript:changeImg()">看不清?换一张</a>
-------------------------------------------------------------------------------------------------------------------------------

2、web.xml中的相关配置部分
-------------------------------------------------------------------------------------------------------------------------------
<servlet>
    <description>生成验证码的Servlet</description>
    <display-name>RandomCode</display-name>
    <servlet-name>RandomCode</servlet-name>
    <servlet-class>com.util.RandomCode</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>RandomCode</servlet-name>
    <url-pattern>*.RandomCode</url-pattern>
</servlet-mapping>
-------------------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值