简单 验证码 功能

在贴代码之前首先简述一下验证验证码原理:随机获取验证码的值,把这个值存到session中,其作用可想而知就是要拿来跟前台数据作比较,通过Graphics将值进行模糊处理之后传到前台页面展示。

  1 package com.skss.util;
  2
  3
  4 import java.awt.Color;
  5 import java.awt.Font;
  6 import java.awt.Graphics;
  7 import java.awt.image.BufferedImage;
  8 import java.io.IOException;
  9 import java.util.Random;
 10
 11 import javax.imageio.ImageIO;
 12 import javax.servlet.ServletException;
 13 import javax.servlet.ServletOutputStream;
 14 import javax.servlet.http.HttpServlet;
 15 import javax.servlet.http.HttpServletRequest;
 16 import javax.servlet.http.HttpServletResponse;
 17 import javax.servlet.http.HttpSession;
 18
 19 @SuppressWarnings("serial")
 20 public class ValidateCodeServlet extends HttpServlet {
 21     char[] codeSequence={‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘,
 22             ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘,
 23             ‘X‘, ‘Y‘, ‘Z‘, ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘ };
 24     public ValidateCodeServlet() {
 25         super();
 26     }
 27
 28     public void destroy() {
 29         super.destroy();
 30     }
 31
 32     public void doGet(HttpServletRequest request, HttpServletResponse response)
 33             throws ServletException, IOException {
 34         this.doPost(request, response);
 35     }
 36
 37     public void doPost(HttpServletRequest request, HttpServletResponse response)
 38             throws ServletException, IOException {
 39         String params = request.getParameter("parame");
 40         response.setContentType("image/jpeg");
 41         response.setHeader("Pragma","No-cache");
 42         response.setHeader("Cache-Control","no-cache");
 43         response.setDateHeader("Expires", 0);
 44         HttpSession session=request.getSession();
 45         // 在内存中创建图象
 46         int width=60, height=20;
 47         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 48         // 获取图形上下文
 49         Graphics g = image.getGraphics();
 50         //生成随机类
 51         Random random = new Random();
 52         // 设定背景色
 53         g.setColor(getRandColor(200,250));
 54         g.fillRect(0, 0, width, height);
 55         //设定字体
 56         g.setFont(new Font("Times New Roman",Font.PLAIN,18));
 57         //画边框
 58         //g.setColor(new Color());
 59         //g.drawRect(0,0,width-1,height-1);
 60         // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
 61         g.setColor(getRandColor(160,200));
 62         for (int i=0;i<155;i++) {
 63             int x = random.nextInt(width);
 64             int y = random.nextInt(height);
 65             int xl = random.nextInt(12);
 66             int yl = random.nextInt(12);
 67             g.drawLine(x,y,x+xl,y+yl);
 68         }
 69         // 取随机产生的认证码(4位数字)
 70         String sRand="";
 71         for (int i=0;i<4;i++){
 72             String rand=String.valueOf(random.nextInt(10));
 73
 74             if(Integer.parseInt(rand)%2==0){
 75                 rand=codeSequence[random.nextInt(36)]+"";
 76             }
 77
 78             sRand+=rand;
 79             // 将认证码显示到图象中
 80             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
 81             g.drawString(rand,13*i+6,16);
 82         }
 83         // 将认证码存入SESSION
 84         session.setAttribute(params,sRand);
 85         // 图象生效
 86         g.dispose();
 87         ServletOutputStream responseOutputStream =response.getOutputStream();
 88         // 输出图象到页面
 89         ImageIO.write(image, "JPEG", responseOutputStream);
 90         //以下关闭输入流!
 91         responseOutputStream.flush();
 92         responseOutputStream.close();
 93     }
 94     Color getRandColor(int fc,int bc){//给定范围获得随机颜色
 95         Random random = new Random();
 96         if(fc>255) fc=255;
 97         if(bc>255) bc=255;
 98         int r=fc+random.nextInt(bc-fc);
 99         int g=fc+random.nextInt(bc-fc);
100         int b=fc+random.nextInt(bc-fc);
101         return new Color(r,g,b);
102     }
103 }

上面的代码注释想必已经描述的很清楚了,这里就不细说了。注意String params = request.getParameter("parame");session.setAttribute(params,sRand); 这是关键

 1        <servlet>
 2         <description>vCode</description>
 3         <display-name>vCode</display-name>
 4         <servlet-name>ValidateCodeServlet</servlet-name>
 5         <servlet-class>
 6             com.skss.util.ValidateCodeServlet
 7         </servlet-class>
 8     </servlet>
 9     <servlet-mapping>
10         <servlet-name>ValidateCodeServlet</servlet-name>
11         <url-pattern>/vcode</url-pattern>
12     </servlet-mapping>

web.xml代码,下面是vcode.jsp页面,后面的参数为了让这个验证码通用,同时保正每个页面的验证码不会因为其他引用的验证码刷新而改变

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3     String path = request.getContextPath();
 4     String basePath = request.getScheme() + "://"
 5             + request.getServerName() + ":" + request.getServerPort()
 6             + path + "/";
 7     String type = request.getParameter("type");
 8 %>
 9 <script>
10 function refresh(){
11     document.location.href = document.location.href;
12 }
13 </script>
14 <img src="${path}/vcode?parame=<%= type%>" onclick="refresh()" style="cursor: pointer;" title="看不清!点击换一个!"/>

下面是引用这个jsp的iframe

1 <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes" src="${path}/app/admin/login/vcode.jsp?type=login_vcode" style="width: 60px;height: 20px;padding: 0,0,0,0;" scrolling="no" ></iframe>

if (!user.getVcode().equalsIgnoreCase(
                    (String) this.request.getSession().getAttribute("login_vcode"))) {
                request.setAttribute("msg", "验证码错误!");
                return "loginx";
            }

简单 验证码 功能,布布扣,bubuko.com

时间: 2024-10-23 04:37:13

简单 验证码 功能的相关文章

利用PHP绘图函数实现简单验证码功能

index.php __________________________________________________________________________________________________________________________ <?php//===================================>>使用绘图技术绘制验证码 //1.随机产生4个随机数$checkCode="";for ($i=0;$i<4;$i

利用Pillow,几行代码实现的最简单的Django页面验证码功能

验证码本质上就是生成带有文字的图片,用来区分人与机器的行为.如果考虑到防止破解自然会涉及到许多复杂的算法,用以防止从图片中容易地识别出文字,但作为一个简单的例子,我们就使用最简单的方法来达成一个验证码的功能.以下就是利用Python的第三方图形处理模块Pillow来实现的一个简单的验证码功能: 首先,在accounts.views中定义一个生成验证码的函数: from PIL import Image, ImageDraw, ImageFont from django.http.response

php实现简单的验证码功能

1.根据php中的GD库对图片进行处理,绘制出验证码的图片,code.php中2.表单界面,简单的session保存及与用户输入对比,确定是否验证正确,form.php中 <?php session_start();//必须位于脚本的最顶端 $image=imagecreatetruecolor(100, 30);//imagecreatetruecolor函数建一个真彩色图像 //生成彩色像素 $bgcolor=imagecolorallocate($image, 255, 255, 255)

简单验证码的识别

验证码图片均取自于国内某知名信息安全网站,通过图像处理.模板对比识别等步骤,实现了该类简单验证码图片的识别功能.同时对程序实现了可视化界面,并集成了(验证码)图片下载.(灰度值)门限手动调节等扩展功能.代码存在github,传送门请戳我. 一.程序内容及原理 本程序以Python实现,主要借助了PIL(Python Image Library,实现读取图片.读取灰度值等图像处理相关功能)及tkinter(实现界面设计相关功能)两个库.图像处理及识别的主程序的总体流程如下:导入(读取)验证码图片,

使用JS来实现验证码功能

最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是很难. 简单来说,用一个create_code()方法在页面中生成验证码,然后control_submit()方法检测验证码文本框(id="user_input_code")的键盘输入事件,当文本框输入了超过4个字符后,调用verify_code ()检测输入的字符与生成的验证码是否一致,

thinkphp验证码功能

Think\Verify类可以支持验证码的生成和验证功能. 为了显示这个验证码功能,第一要有控制器,再就是有方法,然后是显示的页面. 一.最简单的方式生成验证码 (1)我们还是继续在那个控制器编写方法 这个方法显示这个验证码的页面 public function xianshi() { $this->show(); } public function shengcheng() { //造验证码的对象 $v = new \Think\Verify(); //生成验证码 $v->entry();

Php实现验证码功能

验证码这样的功能可以说是无处不在了,接下来使用php来实现验证码这样的功能,这里我是将验证码实现抽取到一个类中独立开来,那么后面如果再使用到验证码功能,直接引入该类文件并创建该类的实例,就可以使用验证码了,代码如下: 验证码类文件vcode.class.php <?php /** *验证码类 */ class Vcode{ private $width;//图片宽度 private $height;//图片高度 private $num;//验证码个数 private $img;//图片资源 p

php基础之gd图像生成、缩放、logo水印和简单验证码实现

php基础之gd图像生成.缩放.logo水印和简单验证码实现 阅读目录 图像生成 缩略图 水印生成 验证码 gd 库是php最常用的图片处理库之一(另外一个是imagemagick),可以生成图片.验证码.水印.缩略图等等.要使用gd库首先需要开启gd库扩 展,windows系统下需要在php.ini中将extension=php_gd2.dll 前边的分号去掉然后重启web服务器,linux系统下一般在编译php时已经开启gd库扩展,要是没有开启gd库扩展则需要先编译安装freetype ,j

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer