验证码的生成

一、servlet生成

    1、servlet 

package servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 生成随机的验证码
 */
@SuppressWarnings("serial")
public class ImgServlet extends HttpServlet {
	/**
	 * 生成随机颜色
	 */
	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);
 	}
	
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
		HttpSession session  = request.getSession();
		  //设置页面不缓存
		 response.setHeader("Pragma", "No-cache");
		 response.setHeader("Cache-Control", "no-cache");
		 response.setDateHeader("Expires", 0);
		
		 // 在内存中创建图象
		 int width = 80, 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.BOLD, 18));
		
		 //画边框
		 g.setColor(new Color(0, 0, 0));
		 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 = null;
		  //随机生成数字或者字母
		  if (random.nextInt(10) > 5) {
		   rand = String.valueOf((char)(random.nextInt(10) + 48));
		  } else {
		   rand = String.valueOf((char)(random.nextInt(26) + 65));
		  }
		  sRand += rand;
		  
		  // 将认证码显示到图象中
		  g.setColor(new Color(random.nextInt(80), random.nextInt(80), random.nextInt(80)));
		  //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
		  g.drawString(rand, 15 * i + 10, 16);
		 }
		 
		 // 将认证码存入SESSION
		 session.setAttribute("rand", sRand);
	
		 // 图象生效
		 g.dispose();
		
		 // 输出图象到页面
		 ImageIO.write(image, "JPEG", response.getOutputStream());
	}
}

    

    2、web.xml文件

<servlet>
        <servlet-name>ImgServlet</servlet-name>
	<servlet-class>servlet.ImgServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ImgServlet</servlet-name>
	<url-pattern>/ImgServlet</url-pattern>
</servlet-mapping>

 

   3、页面

<tr bgcolor="#c9c9c9">
      <td align="right" bgcolor="#e8e8e8">验证图片:</td>
      <td bgcolor="#e8e8e8"><input type="text" name="yanZhen" id="yanZhen" /></td>
      <td bgcolor="#e8e8e8">
         <img src="ImgServlet" border="0" id="yanZhengImg" name="yanZhengImg" style="vertical-align:middle" />
         &nbsp;&nbsp;&nbsp;&nbsp;
      <a style="color:blue;text-decoration:none;" href="#" onClick="javascript:var dt=new Date();document.getElementById('yanZhengImg').src='ImgServlet?dt='+dt;">*看不清换一张</a>
      </td>
</tr>

 

二、jsp页面生成 image.jsp页面 

<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" 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);
 	}
%>
<%
	 //设置页面不缓存
	 response.setHeader("Pragma", "No-cache");
	 response.setHeader("Cache-Control", "no-cache");
	 response.setDateHeader("Expires", 0);
	
	 // 在内存中创建图象
	 int width = 80, 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.BOLD, 18));
	
	 //画边框
	 g.setColor(new Color(0, 0, 0));
	 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 = null;
	  //随机生成数字或者字母
	  if (random.nextInt(10) > 5) {
	   rand = String.valueOf((char)(random.nextInt(10) + 48));
	  } else {
	   rand = String.valueOf((char)(random.nextInt(26) + 65));
	  }
	  sRand += rand;
	 
	 //String str = (String) session.getAttribute("rand");
	  // 将认证码显示到图象中
	  g.setColor(new Color(random.nextInt(80), random.nextInt(80), random.nextInt(80)));
	  //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
	  g.drawString(rand, 15 * i + 10, 16);
	 }
	 
	 // 将认证码存入SESSION
	 session.setAttribute("rand", sRand);
 
	 //System.out.println("rand = " + sRand);
	 // 图象生效
	 g.dispose();
	
	 // 输出图象到页面
	 ImageIO.write(image, "JPEG", response.getOutputStream());
%>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值