当前位置: 亚洲城ca88 > ca88 > 正文

验证码功能,常用图像的应用

时间:2019-08-09 00:40来源:ca88
Servlet案例3:验证码功能,servlet案例3验证码 这里介绍简单的验证码功能 动态生成图片   一个简单的页面: !DOCTYPE htmlhtmlheadmeta charset="UTF-8"titleInsert title here/titlescript type="text/javascript

Servlet案例3:验证码功能,servlet案例3验证码

这里介绍简单的验证码功能

动态生成图片

 

一个简单的页面:

ca88 1

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function changeImg(obj){
        obj.src="/WEB4/checkImg?time=" new Date().getTime();
    }
</script>

</head>
<body>    
    <form action="/WEB13/login" method="post">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"><br/>
        验证码:<input type="text" name="username"><img onclick="changeImg(this)" src="/WEB4/checkImg"><br/>
        <input type="submit" value="登录"><br/>
    </form>
</body>
</html>

View Code

简单的JS代码实现点击验证码图片刷新

 

验证码功能:

ca88 2

package demo;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 验证码生成程序
 * 
 * 
 * 
 */
public class CheckImgServlet extends HttpServlet {

    // 集合中保存所有成语
    private List<String> words = new ArrayList<String>();

    @Override
    public void init() throws ServletException {
        // 初始化阶段,读取new_words.txt
        // web工程中读取 文件,必须使用绝对磁盘路径
        String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
        try {
            BufferedReader reader = new BufferedReader(new FileReader(path));
            String line;
            while ((line = reader.readLine()) != null) {
                words.add(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 禁止缓存
        // response.setHeader("Cache-Control", "no-cache");
        // response.setHeader("Pragma", "no-cache");
        // response.setDateHeader("Expires", -1);

        int width = 120;
        int height = 30;

        // 步骤一 绘制一张内存中图片
        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);

        // 步骤二 图片绘制背景颜色 ---通过绘图对象
        Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
        // 绘制任何图形之前 都必须指定一个颜色
        graphics.setColor(getRandColor(200, 250));
        graphics.fillRect(0, 0, width, height);

        // 步骤三 绘制边框
        graphics.setColor(Color.WHITE);
        graphics.drawRect(0, 0, width - 1, height - 1);

        // 步骤四 四个随机数字
        Graphics2D graphics2d = (Graphics2D) graphics;
        // 设置输出字体
        graphics2d.setFont(new Font("宋体", Font.BOLD, 18));

        Random random = new Random();// 生成随机数
        int index = random.nextInt(words.size());
        String word = words.get(index);// 获得成语

        // 定义x坐标
        int x = 10;
        for (int i = 0; i < word.length(); i  ) {
            // 随机颜色
            graphics2d.setColor(new Color(20   random.nextInt(110), 20   random
                    .nextInt(110), 20   random.nextInt(110)));
            // 旋转 -30 --- 30度
            int jiaodu = random.nextInt(60) - 30;
            // 换算弧度
            double theta = jiaodu * Math.PI / 180;

            // 获得字母数字
            char c = word.charAt(i);

            // 将c 输出到图片
            graphics2d.rotate(theta, x, 20);
            graphics2d.drawString(String.valueOf(c), x, 20);
            graphics2d.rotate(-theta, x, 20);
            x  = 30;
        }

        // 将验证码内容保存session
        request.getSession().setAttribute("checkcode_session", word);

        // 步骤五 绘制干扰线
        graphics.setColor(getRandColor(160, 200));
        int x1;
        int x2;
        int y1;
        int y2;
        for (int i = 0; i < 30; i  ) {
            x1 = random.nextInt(width);
            x2 = random.nextInt(12);
            y1 = random.nextInt(height);
            y2 = random.nextInt(12);
            graphics.drawLine(x1, y1, x1   x2, x2   y2);
        }

        // 将上面图片输出到浏览器 ImageIO
        graphics.dispose();// 释放资源

        //将图片写到response.getOutputStream()中
        ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    /**
     * 取其某一范围的color
     * 
     * @param fc
     *            int 范围参数1
     * @param bc
     *            int 范围参数2
     * @return Color
     */
    private 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);
    }

}

View Code

 

这里采用的是成语的验证码,将很多个成语存到WEB-INF目录下一个文本中,每行一个即可

 

补上web.xml配置文件

ca88 3

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WEB4</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>CheckImgServlet</display-name>
    <servlet-name>CheckImgServlet</servlet-name>
    <servlet-class>demo.CheckImgServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckImgServlet</servlet-name>
    <url-pattern>/checkImg</url-pattern>
  </servlet-mapping>
</web-app>

View Code

ca88, 

这里介绍简单的验证码功能 动态生成图片 一个简单的页面: ! DOCTYPE html html head meta charset ="...

现在的程序中,为了防止用户恶意点击,我们一般都会加上验证,现在比较普遍的是加上图片验证码或者手机短信验证。验证码一般都是防机器不防人,有效的防止了恶意点击。

php生成动态的验证码,是php防止恶意登陆或者注册等常规手段-废话不多说,直接看例子。(只是一个简单的应用,如果要安全或者更复杂的,请期待我以后的文章)

那么在webform中如何生成动态的图片验证码呢?

PHP生成验证码核心文件 (checks.php):

ca88 4ca88 5

<?php
    /*成生随机的验证码。此实例只是一个简单的例子,如果不想被人识别,还可以加噪点等干扰技术*/
    session_start(); //启动session
    header("Content-type:image/x-png"); //设置创建图像的格式
    $image_width = 70;  //设置图像的宽度
    $image_height = 18;  //设置图像的高度
    srand(microtime()*100000);  //设置随机数的种子。 --这里关于srand和microtime函数请自行查阅php手册
    for($i=0; $i<4; $i  )    //循环输出一个4位数的随机数
    {
        $new_number.=dechex(rand(0,15)); //将十进制随机数转为十六进制
    }

    /*将获取的随机数验证码写入到Session变量中  --这里注意php的变量作用范围,和别的高级语言可能有些
      不同,所以要理解,自己去查手册*/
    $_SESSION['check_checks'] = $new_number;
    $num_image = imagecreate($image_width,$image_height);  //创建一个画布
    imagecolorallocate($num_image,255,255,255);  //设置画布的颜色
    for($i=0; $i<strlen($_SESSION['check_checks']); $i  )  //循环读取session变量中的验证码
    {
        $font = mt_rand(3,5); //设置随机的字体大小
        $x = mt_rand(1,8) $image_width*$i/4;  //设置随机字符所在的位置的X坐标
        $y = mt_rand(1,$image_height/4);  //设置随机字符所在的位置的Y坐标
        //设置字符的颜色
        $color = imagecolorallocate($num_image,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200));
        //水平画出一行字符串 --输出字符,此函数自行查阅php手册。要GD2库支持
        imagestring($num_image,$font,$x,$y,$_SESSION['check_checks'][$i],$color);
    }
    imagepng($num_image); //生成png格式的图像
    imagedestroy($num_image);  //结束图像,释放资源
?>

View Code

首先,我们新建一个ValidateImage.aspx页面,前台页面中写任何代码,在ValidateImage.aspx.cs中加入如下代码:

PHP页面验证文件,判断是否和生成的验证码相同 (login.php):

ca88 6ca88 7

<?php
    header("Content-type:text/html;charset=utf-8");
    session_start();  //初始化session
    if($_POST['checks'] != "")  //判断是否请求过来的为空
    {
        //如果不为空进行一个正则的替换,替换掉所有的空格 preg_replace()函数中用''而不是""来表示
        $checks = preg_replace('/[s| ]/','',$_POST['checks']);
        echo "<script type='text/javascript'>
                prompt('这是您输入的验证码:','$checks');
              </script>";
        if($checks == "")
        {
            echo "<script type='text/javascript'>
            alert('验证码不能为空');window.location.href='index.php';
            </script>";    
        }

        //如果用户输入验证码的值与随机生成的验证码的值相等,则弹出登录成功提示
        if($checks == $_SESSION['check_checks'])
        {
            echo "<script type='text/javascript'>
            alert('用户登录成功');window.location.href='index.php';
            </script>";    
        }
        else
        {
            echo "<script type='text/javascript'>
            alert('您输入的验证码不正确!');window.location.href='index.php';
            </script>";    
        }
    }
    else
    {
        echo "<script type='text/javascript'>
            alert('您没有输入验证码!');window.location.href='index.php';
            </script>";    
    }
?>

View Code

ca88 8ca88 9

页面呈现登陆文件 (index.html或者index.php):

ca88 10ca88 11

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
    //封装javascript的trim去掉字符串空格功能。
    function trim(strToTrim)
    {
        //用正则来返回替换后的字符。--功能,去掉所有的空格!包括换行符等。 关于正则知识,请自行查阅资料
        return strToTrim.replace(/(s )/g,"");
    }

    function yz()
    {
        //先用js检测是否已经输入验证码,减少服务器压力,当然服务器那边也是要验证的
        if(trim(form1.checks.value) == "")
        {
            alert("对不起!你没有输入验证码!");
            return false; //返回flase不提交
        }
        return true;
    }
</script>
</head>

<body>
    <div id="main">
        <form action="login.php" method="post" name="form1">
            <label>验证码:</label>
            <input type="text" name="checks" />
            <img src="checks.php" title="验证码" alt="验证码显示错误" />
            <br />
            <input type="submit" value="提交验证" onclick="return yz();" />
        </form>
    </div>
</body>
</html>

View Code

 

    public partial class ValidateImage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            this.CreateCheckCodeImage(RndNum());
        }
        private string RndNum()
        {
            int number;
            char code;
            string checkCode = String.Empty;

            System.Random random = new Random();

            for (int i = 0; i < 4; i  )
            {
                number = random.Next();
                if (number % 2 == 0)
                    code = (char)('0'   (char)(number % 10));
                else
                    code = (char)('A'   (char)(number % 26));
                checkCode  = code.ToString();
            }
            Response.Cookies.Add(new HttpCookie("yzmcode", checkCode));
            return checkCode;
        }

        /// <summary>向页面生成验证码Gif图片
        /// </summary>
        /// <param name="checkCode"></param>
        private void CreateCheckCodeImage(string checkCode)
        {
            if (checkCode == null || checkCode.Trim() == String.Empty)
                return;
            System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
            Graphics g = Graphics.FromImage(image);
            try
            {
                //生成随机生成器
                Random random = new Random();
                //清空图片背景色
                g.Clear(Color.White);
                //画图片的背景噪音线
                for (int i = 0; i < 25; i  )
                {
                    int x1 = random.Next(image.Width);
                    int x2 = random.Next(image.Width);
                    int y1 = random.Next(image.Height);
                    int y2 = random.Next(image.Height);
                    g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                }

                Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
                System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
                g.DrawString(checkCode, font, brush, 2, 2);
                //画图片的前景噪音点
                for (int i = 0; i < 100; i  )
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);
                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }
                //画图片的边框线
                g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                Response.ClearContent();
                Response.ContentType = "image/Gif";
                Response.BinaryWrite(ms.ToArray());
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }
    }

View Code

然后在新建一个index.html页面,在页面中添加如下代码:

ca88 12ca88 13

 <script type="text/javascript">

        function changeImg() {
            $("#imgCheckNo").attr("src", "ValidateImage.aspx?r="   getRandom(999));
        }

    </script>
<img id="imgCheckNo" src="ValidateImage.aspx" style="border-color: #000000; border-width: 1px; border-style: Solid; width: 200px; height: 50px; margin-left: 10px;" onclick="changeImg();" />

View Code

记得引用一个jquery脚本库,不然点击图片验证码它是不会刷新的。

这样我们的图片验证码就生成成功了!

因为生成的图片验证码是保存在cookie中的,我们在ASP.NET后台中很容易就能获取到cookie值,那么在js中,怎么才能获取到呢?

ca88 14ca88 15

    <script type="text/javascript">

            $("btn").click({
                //获取输入框的值
                var yenzhen = $("#yanzhen").val();

                //获取cookie值
                var cookie_val = getCookie("yzmcode");

                //截取cookie值后四位
                var cookie = cookie_val.substr(cookie_val.length - 4);

                //因为cookie中的值字母是大写,所以把输入的值中的字母转换成大写
                yenzhen.toUpperCase()
            })




        //获取cookie值
        var allcookies = document.cookie;

        //定义一个函数,用来读取特定的cookie值。
        function getCookie(cookie_name) {
            var allcookies = document.cookie;
            var cookie_pos = allcookies.indexOf(cookie_name);   //索引的长度
            // 如果找到了索引,就代表cookie存在,

            // 反之,就说明不存在。

            if (cookie_pos != -1) {
                // 把cookie_pos放在值的开始,只要给值加1即可。
                cookie_pos  = cookie_name.length   1;      //这里我自己试过,容易出问题,所以请大家参考的时候自己好好研究一下。。。
                var cookie_end = allcookies.indexOf(";", cookie_pos);
                if (cookie_end == -1) {
                    cookie_end = allcookies.length;
                }
                var value = unescape(allcookies.substring(cookie_pos, cookie_end)); //这里就可以得到你想要的cookie的值了。。。
            }
            return value;
        }
    </script>            

View Code

这样就可以获取到验证码了!

 

编辑:ca88 本文来源:验证码功能,常用图像的应用

关键词: 亚洲城ca88