验证码思想:所谓验证码就是产生若干随机数,存放到session中,然后在servlet中获取session中的该值与页面输入值相比较,进而判断正误。
 
产生验证码的方法
随机数放在图片中,封装为一个JSP文件,并且将产生的验证码存放到session中。
 
刷新验证码的方法
方法一:点击验证码图片刷新:
验证码封装在JSP文件里,在表单中以图片的方式引入,代码如下:
<img id= "rightcode" src ="number.jsp" style=" cursor: pointer; vertical-align :middle;" onclick="javascript:this.src='number.jsp?'+Math.random()*10000;" />
点击换一张验证码,本质就是将验证码的src刷新一下,上一行代码中通过点击事件来刷新src.
方法二:可以在验证码后面加链接文字,通过JS实现点击刷新验证码的src。
如:
<script language= "JAVASCRIPT">
      /*点击换一张验证码,本质就是将验证码的src刷新一下*/
     function cg(){                                       
          document.getElementById( "rightcode" ).src = 'number2.jsp?' +Math.random()*10000;
     }
</ script>
<a href= "javascript:cg();">换一张 </a>
 
 
 
 
产生版本一验证码文件number.jsp代码如下:
<%@ page contentType= "image/jpeg" language ="java"
import="java.util.*,java.awt.*,java.awt.image.*,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-catch" ); 
    response.setDateHeader( "Expires",0); 
     
    //在内存中创建图象 
    int width = 60; 
    int 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( "Tines Nev Roman",Font.PLAIN,18)); 
    //随机产生干扰线 
    g.setColor(getRandColor(160,200)); 
    for(int i = 0; i < 255; i++){ 
        int x = random.nextInt(width); 
        int y = random.nextInt(height); 
        int xl = random.nextInt(12); 
        int yl = random.nextInt(12); 
    } 
    //随机产生认证码,4位数字 
    String sRand = ""; 
    for(int i = 0; i < 4; i++){ 
        String rand = String.valueOf(random.nextInt(10)); 
        sRand  += rand; 
        //将认证码显示到图象中 
        g.setColor( new Color(20 + random.nextInt(110),20 + random.nextInt(110),20 + random.nextInt(110))); 
        g.drawString(rand,13*i+6,16); 
    } 
    /*把产生的验证码放到session中,在LoginServlet中获得该值与输入的验证码值进行比较*/
    session.setAttribute( "jpgCode",sRand); 
    //图像生效 
    g.dispose(); 
    //输出图像到页面 
    ImageIO.write(image,"JPEG" ,response.getOutputStream()); 
    out.clear(); 
    out = pageContext.pushBody(); 
%>
 
LoginServlet中获取值:
String incode = request.getParameter( "code");  
Object rightcode = request.getSession().getAttribute("jpgCode" );
进过比较二者的值是否一样,从而进行页面的跳转。 
 
 
产生版本二验证码文件number.jsp代码如下:
<%@ page language="java"  pageEncoding="UTF-8"   %>
<%@ page contentType= "image/jpeg" 
import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
    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);
 
     //生成随机验证码
     Random random = new Random();
     String sRand = "";
     for ( int i = 0; i < 4; i++) {
          String rand = String.valueOf(random.nextInt(10));
          sRand += rand;
     }
    /*把产生的验证码放到session中,在LoginServlet中获得该值与输入的验证码值进行比较*/
     session.setAttribute( "jpgCode", sRand);
 
     // 在内存中创建图象
     int width = 55;
     int height = 20;
     BufferedImage image = new BufferedImage(width, height,
              BufferedImage.TYPE_INT_RGB);
 
     // 获取图形上下文
     Graphics g = image.getGraphics();
 
     // 设定背景色
     g.setColor(getRandColor(200, 250));
     g.fillRect(0, 0, width, height);
 
     //设定字体
     g.setFont( new Font("serif" , Font.CENTER_BASELINE, 16));
 
     //画边框
     g.setColor( new Color(1));
     g.drawRect(0,0,width-1,height-1);
 
     // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
     g.setColor(getRandColor(160, 200));
     for ( int i = 0; i < 100; 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);
     }
 
     for ( int i = 0; i < 4; i++) {
          String rand = sRand.substring(i, i + 1);
           // 将认证码显示到图象中
          g.setColor( new Color(20 + random.nextInt(110), 20 + random
                   .nextInt(110), 20 + random.nextInt(110)));
           //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
          g.drawString(rand, 13 * i + 6, 16);
     }
 
     // 图象生效
     g.dispose();
 
     // 输出图象到页面
     try {
          ImageIO.write(image, "JPEG", response.getOutputStream());
     } catch (Exception e) {
     }
     out.clear();
     out = pageContext.pushBody();
%>
 
 
 
产生版本三验证码文件number.jsp代码同版本二:
在引用页面加刷新事件,可以点击刷新验证码。
部分代码如下:
<script language= "JAVASCRIPT">
      /*点击换一张验证码,本质就是将验证码的src刷新一下*/
     function cg(){                                       
          document.getElementById( "rightcode" ).src = 'number2.jsp?' +Math.random()*10000;
     }
</ script>
<div class= "field">
     <label>< span class ="red"> *</span>验证码 </label>
     <span>
         <input type= "text" name ="code" id="code" class="yzm">
         <img id= "rightcode" src="number.jsp" style=" cursor: pointer; vertical-align:middle ;" onclick="javascript:this.src='number.jsp?'+Math.random()*10000;" />
         <a href= "javascript:cg();">换一张 </a>
     </span>
</div>
 
 
 
 
 
 
 
 

Servlet程序中玩验证码的更多相关文章

  1. SSH实战 · SSH项目中怎么玩验证码

    大致思路与之前servlet中玩验证码类似,生成随机数,产生干扰线,画到图片上,保存到session中. 本人习惯用的时候专门写一个验证码的action:CheckImgAction. step1: ...

  2. 【转】在Eclipse中建立第一个Servlet程序

    转载地址:http://kin111.blog.51cto.com/738881/163354 继上篇在Eclipse中搭好了tomcat环境后,我们建立一个最简单的servlet程序,这个serve ...

  3. [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  4. servlet中生成验证码

    在servlet中生成验证码 package login; import java.awt.Color; import java.awt.Graphics; import java.awt.image ...

  5. Servlet笔记2--模拟Servlet本质、第一个Servlet程序、将响应结果输出到浏览器中

    以下代码均非IDE开发,所以都不规范,仅供参考 模拟Servlet本质: 模拟Servlet接口: /* SUN公司制定的JavaEE规范:Servlet规范 Servlet接口是Servlet规范中 ...

  6. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  7. Servlet实现数字字母验证码图片(二)

    Servlet实现数字字母验证码图片(二): 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. Web UI自动化测试中绕开验证码登陆方式浅谈

    web自动化测试中让测试者感到困惑的是登陆验证码,每次都不一样.现在推荐一种绕开验证码登陆的方式,其实就是将web浏览器获取的登陆cookie加载到程序中就可以了,这样程序就会认为你已经登陆,就可以跳 ...

  9. 可视化(番外篇)——在Eclipse RCP中玩转OpenGL

    最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...

随机推荐

  1. 【Mybatis架构】Mapper映射文件中的#{}与${}

    前言 还记得当初从北京回来的时候,跟着倪文杰师姐做JavaITOO的一卡通模块,我亲姐贾梦洁带着我一块做,期间,我遇到了一个特别奇葩的问题,就死我要实现Mybatis的模糊查询,根据当时亲姐教给我方法 ...

  2. Redis 数据库入门指南

    Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库.缓存和消息代理使用.Redis 支持丰富的数据结构,有:字符串(Strings).哈希(Hashs).列表(Lists).集合(Se ...

  3. SPOJ - PLSQUARE Palin Squar(hash+回文串)

    题意:给你一个n*n (n<=200)的字符串矩阵,问你每行每列都是回文串的最大的m*m的矩阵是多少 题解:首先答案不满足单调性,即m成立而m-1与m+1都却不一定成立,所以必须枚举答案确定现在 ...

  4. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  5. Linux Shell 重定向与管道【转帖】

    by 程默 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以 ...

  6. 开启PHP的伪静态

    1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有 apache2handl ...

  7. HTML5将图片转化成字符画

    HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...

  8. 解决Android界面布局添加EditText组件后界面无法预览

    错误报告: Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V Exception details are ...

  9. JSP内置对象及常用方法

    jsp九大内置对象及四个作用域: 何为作用域 先让我们看看效果: 大概流程是这样的,我们访问index.jsp的时候,分别对pageContext, request, session,applicat ...

  10. elasticsearch 之mapping

    搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float ...