验证码的使用(Java和PHP版)

来源:互联网 发布:织梦cms首页轮播图 编辑:程序博客网 时间:2024/05/19 15:39

验证码的作用大部分都是为减少服务器压力而设计的,这玩意也挺古老的,谈不上什么新奇。无论是java还是php生成验证码的原理都一样。

1.php验证码

<?php//checkNum.phpsession_start();function random($len){$srcstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";mt_srand();//配置乱数种子$strs="";for($i=0;$i <$len;$i++){$strs.=$srcstr[mt_rand(0,35)];}return strtoupper($strs);}$str=random(4); //随机生成的字符串" title="字符串" >字符串$width = 50; //验证码图片的宽度$height = 20; //验证码图片的高度@header("Content-Type:image/png");$_SESSION["code"] = $str;//echo $str;$im=imagecreate($width,$height);//背景色$back=imagecolorallocate($im,0xFF,0xFF,0xFF);//模糊点颜色$pix=imagecolorallocate($im,187,230,247);//字体色$font=imagecolorallocate($im,41,163,238);//绘模糊作用的点mt_srand();for($i=0;$i <1000;$i++){imagesetpixel($im,mt_rand(0,$width),mt_rand(0,$height),$pix);}imagestring($im, 5, 7, 5,$str, $font);imagerectangle($im,0,0,$width-1,$height-1,$font);imagepng($im);imagedestroy($im);$_SESSION["code"] = $str;?>

基本上都是先调用一个绘图的方法,把图像放到输出流,之后显示在页面上


2.java版验证码

java这块就麻烦点,生成验证码的程序一般写在servlet里,这种是最简单的方式。稍复杂的可以用一些第三方的验证码jar包

(1)数字版验证码

package org.lxh;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.awt.*;import java.awt.image.*;import java.util.*;import javax.imageio.*;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class ImageCode2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubthis.doPost(request, response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 在内存中创建图象int iWidth = 60, iHeight = 18;BufferedImage image = new BufferedImage(iWidth, iHeight,BufferedImage.TYPE_INT_RGB);// 获取图形上下文Graphics g = image.getGraphics();// 设定背景色g.setColor(Color.white);g.fillRect(0, 0, iWidth, iHeight);// 画边框g.setColor(Color.black);g.drawRect(0, 0, iWidth - 1, iHeight - 1);// 取随机产生的认证码(4位数字)Random random = new Random();String rand = String.valueOf(random.nextInt(10000));// rand=rand.substring(0,rand.indexOf("."));switch (rand.length()) {case 1:rand = "000" + rand;break;case 2:rand = "00" + rand;break;case 3:rand = "0" + rand;break;default:rand = rand;break;}// 将认证码存入SESSIONrequest.getSession().setAttribute("Rand", rand);// 将认证码显示到图象中g.setColor(Color.black);g.setFont(new Font("Times New Roman", Font.PLAIN, 18));g.drawString(rand, 10, 15);// 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到// Random random = new Random();for (int iIndex = 0; iIndex < 88; iIndex++) {int x = random.nextInt(iWidth);int y = random.nextInt(iHeight);g.drawLine(x, y, x, y);}// 图象生效g.dispose();ServletOutputStream outstream = response.getOutputStream();JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outstream);encoder.encode(image);outstream.flush();}}

之后在页面上请求这个servlet,验证码就出来了,页面代码如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>验证码的使用</title></head><script language="javascript" type="text/javascript">  function changeImage(img){      img.src="ImageCode?t="+new Date().getTime();  } </script><body>    输入验证码:<input type="text"/><img src="ImageCode" id="img" onclick="changeImage(this)" style="cursor: pointer;"/></body></html>


页面效果如下:


(2)稍微复杂一点的验证码

package org.lxh;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class ImageCode extends HttpServlet {// 定义可选择的字符public static final char[] CHARS = { '2', '3', '4', '5', '6', '7', '8','9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M','N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };static Random random = new Random();public String getRandomString() {StringBuffer buffer = new StringBuffer();for (int i = 0; i < 6; i++) { // 生成六个字符buffer.append(CHARS[random.nextInt(CHARS.length)]);}return buffer.toString();}public static Color getRandomColor() { // 得到随机颜色return new Color(random.nextInt(255), random.nextInt(255),random.nextInt(255));}public static Color getReverseColor(Color c) { // 得到颜色的反色return new Color(255 - c.getRed(), 255 - c.getGreen(),255 - c.getBlue());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("image/jpeg"); // 设置输出类型String randomString = getRandomString();System.out.println(randomString);// 将getSession()设置为true,当会话不存在是返回nullrequest.getSession(true).setAttribute("ImageCode", randomString);// 设置图片的宽、高int width = 100;int height = 30;Color bcolor = getRandomColor(); // 前景色Color fcolor = getReverseColor(getRandomColor()); // 设置背景色// 创建一个彩色图片BufferedImage bimage = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);// 创建绘图对象Graphics2D g = bimage.createGraphics();// 字体样式为宋体,加粗,20磅g.setFont(new Font("宋体", Font.BOLD, 20));// 先画出背景色g.setColor(bcolor);g.fillRect(0, 0, width, height);// 再画出前景色g.setColor(fcolor);// 绘制随机字符g.drawString(randomString, 20, 22);// 画出干扰点for (int i = 0, n = random.nextInt(100); i < n; i++) {g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);}ServletOutputStream outstream = response.getOutputStream();JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outstream);encoder.encode(bimage);outstream.flush();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}}

这种方式的验证码是下面这个样子:


后面的工作就简单了,如果要看验证码对不对,直接从session里取出和输入框里的比对一下就OK了。

0 0
原创粉丝点击