验证码图片实现

来源:互联网 发布:java非对称加密的区别 编辑:程序博客网 时间:2024/06/06 02:39

使用验证码进行验证,自动生成验证码。

后台实现:

package common.makeCertPic;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;public class MakeCertPic {//验证码图片中可以出现的字符集private char mapTable[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i','j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v','w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8','9' };/** * 生产彩色验证码图片 * @param width 生产图片宽度 * @param height 生产图片高度 * @param os 页面输出流 * @return随机生产的验证码 */public String getCertPic(int width,int height,OutputStream os){//设定高度宽度默认值if(width <= 0){width = 60;}if(height <= 0){height = 20;}//创建一个特定样式的BufferedImageBufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取图形上下文Graphics g = image.getGraphics();//设定背景色g.setColor(new Color(0xDCDCDC));g.fillRect(0, 0, width, height);//画边框g.setColor(Color.black);g.drawRect(0, 0, width-1, height-1);//取随机产生的认证码String strEnsure = "";//4代表4位验证码,如果要生产更多位的认证码,则加大数值for(int i = 0; i < 4; i++){strEnsure += mapTable[(int) (mapTable.length * Math.random())];}//将验证码显示到图像中,如果要生产更多位的验证码,增加drawString语句g.setColor(Color.black);g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));String str = strEnsure.substring(0, 1);g.drawString(str, 8, 17);str = strEnsure.substring(1, 2);g.drawString(str, 20, 15);str = strEnsure.substring(2, 3);g.drawString(str, 35, 18);str = strEnsure.substring(3, 4);g.drawString(str, 45, 15);//随机产生10个干扰点,产生多个修改数量10Random rand = new Random();for (int i = 0; i < 10; i++) {int x = rand.nextInt(width);int y = rand.nextInt(height);g.drawOval(x, y, 1, 1);}//释放图形上下文g.dispose();try {ImageIO.write(image, "JPEG", os);} catch (IOException e) {return "";}return strEnsure;}}
图片样式实现:class是引用上面的后台,把验证码字符串放到session中。makeCertPic.jsp

<%@ page language="java" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><%@ page contentType="image/jpeg" %></head><body><jsp:useBean id="image" scope="page" class="common.makeCertPic.MakeCertPic"></jsp:useBean><%String str = image.getCertPic(0,0,response.getOutputStream());// 将认证码存入sessionsession.setAttribute("certCode", str);out.clear();out = pageContext.pushBody();%></body></html>

前台样式实现:
<td><span style="white-space:pre"></span><input name="certCode" type="text"  placeholder="验证码" /></td><td align="right"><span style="white-space:pre"></span><img src="makeCertPic.jsp" id="code" onclick="reloadcode()" alt="看不清楚,换一张"/></td>
<script type="text/javascript">function reloadcode(){var verify = document.getElementById("code");verify.setAttribute('src','makeCertPic.jsp?it='+Math.random());}</script>

后台验证实现:

获取前台input值certCode。进行certCode.equals(session.getAttribute("certCode"))比较。

成功返回true,失败返回false;

以上就是验证码的实现。



0 0
原创粉丝点击