验证码(摘)

1、前台的代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP ‘pic-login.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
    function reload(){
        document.getElementById("image").src="<%=request.getContextPath() %>/ImageServlet?date="+new Date().getTime();
        $("#checkcode").val("");   // 将验证码清空
    }   

     function verificationcode(){
         var text=$.trim($("#checkcode").val());
         $.post("${pageContext.request.contextPath}/VerificationServlet",{op:text},function(data){
             data=parseInt($.trim(data));
             if(data>0){
                 $("#span").text("验证成功!").css("color","green");
             }else{
                $("#span").text("验证失败!").css("color","red");
                reload();  //验证失败后需要更换验证码
                 $("#checkcode").val(""); // 将验证码清空
             }
        });  

     }
</script> 

  </head>

  <body>

         验证码:<input type="text" name="checkcode"  id="checkcode" onchange="javascript:verificationcode()"/>
             <img src="<%=request.getContextPath() %>/ImageServlet" title="点击换一张" id="image"  onclick="javascript:reload()"/>  <span id="span"></span>  

  </body>
</html>

2、这里图片的src是一个servlet-ImageServlet.java

package com.java.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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/ImageServlet")
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ImageServlet() {
        super();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                request.setCharacterEncoding("utf-8");  

                //在内存中创建图象
                 int width = 80;
                 int height = 25;
                 BufferedImage bfi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
                 //创建图象
                 Graphics g = bfi.getGraphics(); 

                 g.fillRect(0, 0, width, height);  

                 //验证码字符范围
                 char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
                 Random r = new Random();
                 int index;
                 StringBuffer sb = new StringBuffer(); //保存字符串
                 //随机产生认证码
                 for(int i=0; i<4; i++){
                     index = r.nextInt(ch.length);
                     g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
                     Font font = new Font("Tines Nev Roman", 30, 20);
                     g.setFont(font);
                     g.drawString(ch[index]+"", (i*20)+2, 23);
                     sb.append(ch[index]);
                }  

                 // 添加噪点
                int area = (int) (0.02 * width * height);
                 for(int i=0; i<area; ++i){
                     int x = (int)(Math.random() * width);
                    int y = (int)(Math.random() * height);
                     bfi.setRGB(x, y, (int)(Math.random() * 255));
                 }  

               //设置验证码中的干扰线
                 for (int i = 0; i < 1; i++) {
                       //随机获取干扰线的起点和终点
                       int xstart = (int)(Math.random() * width);
                       int ystart = (int)(Math.random() * height);
                       int xend = (int)(Math.random() * width);
                       int yend = (int)(Math.random() * height);
                       g.setColor(interLine(1, 255));
                       g.drawLine(xstart, ystart, xend, yend);
                     }
                 HttpSession session = request.getSession();  //保存到session
                 session.setAttribute("verificationCode", sb.toString());
                 ImageIO.write(bfi, "JPG", response.getOutputStream());  //写到输出流  

    }
    private static Color interLine(int Low, int High){
                if(Low > 255)
                    Low = 255;
                if(High > 255)
                    High = 255;
                if(Low < 0)
                    Low = 0;
                if(High < 0)
                    High = 0;
                int interval = High - Low;
                int r = Low + (int)(Math.random() * interval);
                int g = Low + (int)(Math.random() * interval);
                int b = Low + (int)(Math.random() * interval);
                return new Color(r, g, b);
    }  

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}

这里使用ImageServlet生成图片验证码,使用post后台验证,在点击标签换验证码图片的时候,一定要在调用生成图片前加一个时间戳,也就是上面的document.getElementById("image").src="<%=request.getContextPath() %>/imageServlet?date="+new Date().getTime();这句代码的最后加?后面的代码一定不能少,因为浏览器是由缓存的,如果不加时间戳,在点击标签换图片时,验证码图片不会正常更换。

为了便于比对结果,一定要将字符串保存到session。因为session是当前会话有效的,也就是说在你关闭浏览器之前,session里的值都是可以取到的。这里为了增加验证的难度,是不区分大小写的。噪点和干扰线的数量也是可调的。
3、最后是使用VerificationServlet对验证码图片上的字符与输入的字符串进行比对!把存入session中的verificationCode取出来与checkcode进行比对,返回结果

package com.java.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/VerificationServlet")
public class VerificationServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public VerificationServlet() {
        super();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session =request.getSession();
        String verificationCode = (String)session.getAttribute("verificationCode");
        String checkcode = request.getParameter("op");
        PrintWriter out = response.getWriter();
        if(checkcode.equals(verificationCode)){
           out.println(1);
        }else{
            out.println(0);
        }  

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);
    }

}

4、效果

摘自:http://blog.csdn.net/weixian52034/article/details/52186207

时间: 2024-08-05 20:53:42

验证码(摘)的相关文章

php 扭曲验证码

1 <?php 2 3 class image{ 4 public static function code(){ 5 6 $str='abcdefghijklmnopqrstuvwxyz0123456789'; 7 $code = substr(str_shuffle($str),0,5); 8 9 // 2块画布 10 $src = imagecreatetruecolor(60, 25); 11 $dst = imagecreatetruecolor(60, 25); 12 13 // 灰

发送短信验证码按钮 定时器

static int i = 29; @property(nonatomic,strong) NSTimer *timmer;//定时器 - (void)sendNumber{ NSLog(@"发送验证码"); self.getTelephoneCodeBtn.enabled = NO; [self.getTelephoneCodeBtn setTitle:@"已发送" forState:UIControlStateDisabled]; [self.getTelep

ThinkPHP 3.2.3 加减乘法验证码类

ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Verify/ 可以在 Verify.class.php 文件内进行修改,也可以单独写一个类继承自带的验证码类.如果单独写一个继承的类,可以重用父类的属性和方法,但是要注意的是父类中有一些属性和方法是私有(private)的,可以修改这些私有的属性和方法为保护(protected)的,如果不希望修改框架自

制作验证码时 图片无法刷新

1在网页上制作上图中的验证码时,点击图片不能刷新依旧是原图,找了好久终于发现是js语句中的错误,如下: 如果不加后面的new Date().getTime(),每次请求/AuthCode/getAuthCode都是一样的所以图片不会变化,加上之后每次请求会变化,就会重新加载图片了1 function reload(){                    document.getElementById("bt").src="/AuthCode/getAuthCode?&qu

验证码

Random yan=new Random();//随机数种子,注意括号里不要填数 String a="0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";//验证码需要的所有字符 String b []=a.split("");//定义一个数组,用““把每个字符分割 System.out.print("生成的验证码为");//第一种方法 /*for(int i = 0;

网站验证码制作

asp.net验证码制作 using System; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebPa

自动化测试--登录页面验证码问题

对于web应 用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的,对于系统来 说使用验证码可以有效果的防止采用机器猜测方法对口令的刺探,在一定程度上增加了安全性.但对于测试人员来说,不管是进行性能测试还是自动化测试都是一个 棘手的问题. 下面来谈一下处理验证码的几种方法. 去掉验证码 这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚

JCaptcha生成计算式验证码

前两天买了张火车票,令人egg碎的验证已经无力吐槽,试了几次都让我开始怀疑我的IQ是不是适合再从事程序猿的这个"神圣的职业"了.今天分享的是一段比较传统而不失实用的验证,验证的意义想必大家都已知晓. 好了,语言总是苍白无力.直入真题来看代码的实现的吧. 操作环境: jboss eap 6.2 tomcat也可以,比较懒直接用的jboss.大家有兴趣也可以试试,支持的服务更多,性能更加稳定些. servlet 麻雀虽小,五脏俱全,做了小例子足以. JCaptcha jcaptcha是一个

PHP利用GD库画图和生成验证码图片

首先得确定php.ini设置有没有打开GD扩展功能,测试如下 print_r(gd_info()); 如果有打印出内容如下,则说明GD功能有打开: Array ( [GD Version] => bundled (2.0.34 compatible) [FreeType Support] => 1 [FreeType Linkage] => with freetype [T1Lib Support] => 1 [GIF Read Support] => 1 [GIF Crea