精华内容
下载资源
问答
  • 动态验证码生成类
    2020-06-23 15:55:46

    实现动态验证码的生成 。

    package com.gpdi.common.utils;
    
    /**
     * 生成验证码
     */
    import com.gpdi.common.contact.SessionConstant;
    import sun.misc.BASE64Encoder;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.Random;
    
    
    public class VerifyUtil {
    
        /**
         * 随机产生数字与字母组合的字符串
         */
        private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        /**
         * 图片宽
         */
        private int width = 95;
        /**
         * 图片高
         */
        private int height = 25;
        /**
         * 干扰线数量
         */
        private int lineSize = 30;
        /**
         * 随机产生字符数量
         */
        private int stringNum = 4;
    
        private Random random = new Random();
    
        /**
         * 获得字体
         */
        private Font getFont() {
            return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
        }
    
        /**
         * 获得颜色
         */
        private Color getRandColor(int fc, int bc) {
            if (fc > 255) {
                fc = 255;
            }
            if (bc > 255) {
                bc = 255;
            }
            int r = fc + random.nextInt(bc - fc - 16);
            int g = fc + random.nextInt(bc - fc - 14);
            int b = fc + random.nextInt(bc - fc - 18);
            return new Color(r, g, b);
        }
    
        /**
         * 生成随机图片
         */
        public String getRandcode(HttpServletRequest request, HttpServletResponse response, Boolean toBase64) {
            HttpSession session = request.getSession();
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    
            // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
            Graphics g = image.getGraphics();
            //图片大小
            g.fillRect(0, 0, width, height);
    
            //字体大小
            g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
            //字体颜色
    //        g.setColor(getRandColor(110, 133));
            g.setColor(new Color(14,99,155));
            // 绘制干扰线
            for (int i = 0; i <= lineSize; i++) {
                drowLine(g);
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= stringNum; i++) {
                randomString = drowString(g, randomString, i);
            }
            //将生成的随机字符串保存到session中
            session.removeAttribute(SessionConstant.VERIFY_CODE_KEY);
            session.setAttribute(SessionConstant.VERIFY_CODE_KEY, randomString);
    //        //设置失效时间1分钟
    //        session.setMaxInactiveInterval(60);
            g.dispose();
    
            if(!toBase64){
                try {
                    // 将内存中的图片通过流动形式输出到客户端
                    ImageIO.write(image, "JPEG", response.getOutputStream());
    
                    return "";
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            return bufferImageToByte(image);
        }
    
    
        /**
         * BufferedImage转base64
         * @param image
         * @return
         * @throws IOException
         */
        private String bufferImageToByte(BufferedImage image) {
    
            //io流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //写入流中
            try {
                ImageIO.write(image, "JPEG", baos);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //转换成base64串
            byte[] bytes = baos.toByteArray();
            //转换成字节
            BASE64Encoder encoder = new BASE64Encoder();
            String pngBase64 = encoder.encodeBuffer(bytes).trim();
            pngBase64 = pngBase64.replaceAll("\n", "").replaceAll("\r", "");
    
            return "data:image/jpeg;base64,"+pngBase64;
        }
    
        /**
         * 绘制字符串
         */
        private String drowString(Graphics g, String randomString, int i) {
            g.setFont(getFont());
    //        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
    //                .nextInt(121)));
            g.setColor(new Color(14, 99, 155));
            String rand = String.valueOf(getRandomString(random.nextInt(randString
                    .length())));
            randomString += rand;
            g.translate(random.nextInt(3), random.nextInt(3));
            g.drawString(rand, 13 * i, 16);
            return randomString;
        }
    
        /**
         * 绘制干扰线
         */
        private void drowLine(Graphics g) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(13);
            int yl = random.nextInt(15);
            g.drawLine(x, y, x + xl, y + yl);
        }
    
        /**
         * 获取随机的字符
         */
        public String getRandomString(int num) {
            return String.valueOf(randString.charAt(num));
        }
    
        public static Boolean verifyCode(String codeParam, String sessionVerifyCode){
            return codeParam.toLowerCase().equals(sessionVerifyCode.toLowerCase());
        }
    
    }
    

    更多相关内容
  • 这是一个通过php生成的动态验证码图片的示例,重点是可以运行哦!下面先发下效果图: 下面是php生成动态验证码需要用到的相关类和函数。 <?php /** *ImageCode 生成包含验证码的GIF图片的函数 *@param $...
  • .NET MVC Gif动态验证码,模仿苹果商店验证码, .NET MVC 动态验证码
  • 主要介绍了Python发送手机动态验证码代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 动态验证码

    2014-11-10 21:35:13
    动态验证码,方便使用在登录的动态验证码验证。
  • 生成动态验证码,可 防本地自动识别验证码。只能人工打码(反正截图识别是不可能的) ,因为验证码肉眼看是6位数,无论怎么截图都只截到5位数,所以无法用软件识别,只是个思路,仅供参考
  • 主要给大家介绍了关于.NET生成动态验证码的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • gif动态验证码

    2018-09-19 18:13:42
    gif动态验证码,包含springmvc的controller类,代码拷贝进项目就能用。
  • 主要介绍了java Servlet 实现动态验证码图片示例的资料,这里整理了详细的代码,有需要的小伙伴可以参考下。
  • 动态验证码工具

    2018-12-10 08:45:59
    这是一个写验证码的小工具类,非常好用,我一直在用这个
  • php版的动态验证码

    2018-07-23 16:54:25
    php动态验证码类库,自带验证方法,自定义宽高和字体大小。
  • PHP动态验证码

    2014-03-25 17:00:22
    PHP动态验证码,有详细注释。
  • 12306网站推出“彩色动态验证码机制”,新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼“看不清”,称“那个验证码,是毕加索的抽象画么!”铁总客服则表示:为了能正常购票只能这样。而多家抢票软件接近...
  • java GIF 动态验证码实现,内涵另外两种简单验证码格式
  • Android实现动态验证码的技术调研与实现 建议将宽高比设置为5:2,如果不是5:2现在会按照5:2的比例居中显示到控件 usage verificationCodeView.setOnClickListener(new View.OnClickListener() { @Override ...
  • ASP.NET动态验证码

    2013-04-27 16:42:01
    一个ASP.NET下实现动态验证码的例子,很好用
  • C#生成动态验证码

    2016-06-07 15:49:26
    C#生成动态验证码和验证,不区分大小写
  • JavaScript实现页面动态验证码

    万次阅读 多人点赞 2021-03-18 20:43:07
    现在很多在用户登陆或注册的时候为了防止程序攻击,加入了动态验证的技术,一般是让用户输入随即生成的验证码来实现。我自己写了一个没有跟后台交互的,就在前端验证,发出来给大家看看。 效果图: 实现思路:...

    引言:

    现在很多在用户登陆或注册的时候为了防止程序攻击,加入了动态验证的技术,一般是让用户输入随即生成的验证码来实现。我自己写了一个没有跟后台交互的,就在前端验证,发出来给大家看看。

    效果图:

     

    实现思路:

    1. 把数字和字母放到一个数组中,通过随机的方式取得数组下标,总共取4个组成验证码;
    2. 把验证码渲染出来(一个一个的渲染);
    3. 绘制一定数量的干扰线,随机颜色;
    4. 输入验证码,输入4位以后去验证,正确显示钩,错误显示叉并且刷新验证码。

    编写构造函数

    文本构造函数

    //文字的构造函数
    	function Tex
    展开全文
  • java实现动态验证码

    2021-03-21 09:22:03
    java动态实现验证码,供大家参考,具体内容如下【实现效果】点击图片或者文字可以更换验证码验证码随机生成,由大小写字母和数字组成验证码字体颜色随机生成,字母角度有偏转干扰线随机分布验证码的功能: 防止恶意...

    java动态实现验证码,供大家参考,具体内容如下

    【实现效果】

    点击图片或者文字可以更换验证码

    验证码随机生成,由大小写字母和数字组成

    验证码字体颜色随机生成,字母角度有偏转

    干扰线随机分布

    99ff4cbebad244ceb5ac6ef787b06b0d.png

    d6be3d81912550fc5b1349cbb821385d.png

    验证码的功能: 防止恶意的表单注册

    VerificationCode.java 验证码功能实现

    package com.iqqcode.servlet.checkcode;

    import javax.imageio.ImageIO;

    import javax.servlet.ServletException;

    import javax.servlet.ServletOutputStream;

    import javax.servlet.annotation.WebServlet;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.awt.*;

    import java.awt.image.BufferedImage;

    import java.io.IOException;

    import java.util.Random;

    /**

    * @Author: Mr.Q

    * @Date: 2020-02-12 10:12

    * @Description:验证码生成

    */

    @WebServlet("/VerificationCode")

    public class VerificationCode extends HttpServlet {

    @Override

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

    int width = 120;

    int height = 50;

    //1.创建对象,验证码图片对象

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    //2.美化图片

    //2.1填充背景色

    //Graphics g = image.getGraphics();

    Graphics2D g = (Graphics2D) image.getGraphics();//画笔对象,2D来旋转验证码字母

    g.setColor(Color.WHITE);//设置画笔颜色

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

    //2.2画边框

    g.setColor(Color.BLUE);

    g.drawRect(0, 0, width - 1, height - 1);

    //2.3生成验证码

    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    //生成随机角标

    Random random = new Random();

    //改变字体

    g.setFont(new Font("宋体",Font.BOLD,35));

    //将验证码偏转并写到画布上

    for (int i = 1; i <= 4; i++) {

    int x = width/5 * i;

    int y = height/2;

    String msg = "";

    int index = random.nextInt(str.length());

    //获取字符

    char ch = str.charAt(index);//随机字符

    //获取正负30的角度

    int angle = random.nextInt(60) - 30;

    double radian = angle * Math.PI/180;

    //设置验证码中的字体颜色

    //g.setColor(Color.BLUE);

    int red = 0; int green = 0; int blue = 0;

    int codeY = 32;

    // 得到随机产生的验证码数字

    // 产生随机的颜色分量来构造颜色值,使输出的每位数字的颜色值都不同

    red = random.nextInt(255);

    green = random.nextInt(255);

    blue = random.nextInt(255);

    // 用随机产生的颜色将验证码绘制到图像中

    g.setColor(new Color(red, green, blue));

    //写验证码

    g.rotate(radian, x, y);

    //把字母画在画布上

    //g.drawString(ch+"", x, y);

    g.drawString(String.valueOf(ch)+"", x, codeY);

    //把每次旋转的再旋转回来

    g.rotate(-radian, x, y);

    //每次向右移动20像素

    x += 15;

    msg += ch;

    }

    //2.4随机产生20条干扰线,使图象中的认证码不易被其它程序探测到

    g.setColor(Color.MAGENTA);

    //随机生成坐标点

    for (int i = 0; i < 20; i++) {

    int x1 = random.nextInt(width);

    int x2 = random.nextInt(width);

    int y1 = random.nextInt(height);

    int y2 = random.nextInt(height);

    g.drawLine(x1, x2, y1, y2);

    }

    //3.将图片输出到页面展示

    //将图片对象写入流中

    ImageIO.write(image, "jpg", response.getOutputStream());

    }

    @Override

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

    this.doPost(request, response);

    }

    }

    insex.jsp 前台页面展示

    分析:

    点击超链接或者图片,需要换一张

    给超链接和图片绑定单击事件

    重新设置图片的src属性值

    生成的图片先要缓存在本地,每次请求是不会修改,所以验证码图片不会切换;

    将图片路径后添加时间戳,通过错误的路径来欺骗服务器重新请求

    验证码

    window.onload = function () {

    //1.获取图片对象

    var img = document.getElementById("checkCode");

    //2.绑定图片单击事件

    img.onclick = function () {

    //加时间戳

    var date = new Date().getTime();

    //加时间戳,防止浏览器利用缓存

    img.src = "/ServletResponse/VerificationCode?" + date;

    }

    //绑定链接点击事件

    var ahref = document.getElementById("change");

    ahref.onclick = function () {

    var date = new Date().getTime();

    img.src = "/ServletResponse/VerificationCode?" + date;

    }

    }

    验证码动态实现

    VerificationCode

    看不清?换一张

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • Java 生成动态验证码

    2020-12-22 09:30:03
    进行登录等操作时候,可以设置动态验证码的方式,防止系统被机器人恶意攻击
  • python对动态验证码、滑动验证码的降噪和识别

    千次阅读 多人点赞 2021-08-27 12:30:40
    python对动态验证码、滑动验证码的降噪和识别,在各种自动化操作中,我们经常要遇到沿跳过验证码的操作,而对于验证码的降噪和识别,的确困然了很多的人。这里我们就详细讲解一下不同验证码的降噪和识别。如果这篇...

    〝 古人学问遗无力,少壮功夫老始成 〞

    python对动态验证码、滑动验证码的降噪和识别,在各种自动化操作中,我们经常要遇到沿跳过验证码的操作,而对于验证码的降噪和识别,的确困然了很多的人。这里我们就详细讲解一下不同验证码的降噪和识别。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

    注意:在学习验证码降噪之前,飞兔小哥哥给大家推荐一款超好用的商城系统,麻烦各位小可爱动动可爱的小手指帮忙点一下 http://gitee.likemarket.net/BZ49rotS

    目录

    一、动态验证码 

    二、滑动验证码

    三、验证码的降噪

    四、验证码的识别


    一、动态验证码 

    • 动态验证码是服务端生成的,点击一次,就会更换一次,这就会造成很多人在识别的时候,会发现验证码一直过期
    • 这是因为,如果你是把图片下载下来,进行识别的话,其实在下载的这个请求中,其实相当于点击了一次,这个验证码的内容已经被更换了
    • 最好的方法是,打开这个页面后,将页面进行截图,然后定位到验证码的位置,将验证码从截图上面裁剪下来进行识别,这样就不会造成多次请求,验证码更换的情况了

    from selenium import webdriver
    from PIL import Image
    
    # 实例化浏览器
    driver = webdriver.Chrome()
    
    # 最大化窗口
    driver.maximize_window()
    
    # 打开登陆页面
    driver.get(# 你的url地址)
    
    # 保存页面截图
    driver.get_screenshot_as_file('./screen.png')
    
    # 定位验证码的位置
    location = driver.find_element_by_id('login_yzm_img').location
    size = driver.find_element_by_id('login_yzm_img').size
    left = location['x']
    top =  location['y']
    right = location['x'] + size['width']
    bottom = location['y'] + size['height']
    
    # 裁剪保存
    img = Image.open('./screen.png').crop((left,top,right,bottom))
    img.save('./code.png')
    
    driver.quit()
    

    二、滑动验证码

    • 滑动验证码,通常是两个滑块图片,将小图片滑动到大图片上的缺口位置,进行重合,即可通过验证
    • 对于滑动验证码,我们就要识别大图上面的缺口位置,然后让小滑块滑动响应的位置距离,即可
    • 而为了让你滑动起来,更加的拟人化,你需要一个滑动的路径,模拟人为去滑动,而不是机器去滑动

    # 下载两个滑块
    bg = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[1]').get_attribute('src')
    slider = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[2]').get_attribute('src')
    
    request.urlretrieve(bg, os.getcwd() + '/bg.png')
    request.urlretrieve(slider, os.getcwd() + '/slider.png')
    
    
    # 获取两个滑块偏移量方法
    def getGap(self, sliderImage, bgImage):
        '''
        Get the gap distance
        :param sliderImage: the image of slider
        :param bgImage: the image of background
        :return: int
        '''
        bgImageInfo = cv2.imread(bgImage, 0)
        bgWidth, bgHeight = bgImageInfo.shape[::-1]
        bgRgb = cv2.imread(bgImage)
        bgGray = cv2.cvtColor(bgRgb, cv2.COLOR_BGR2GRAY)
    
        slider = cv2.imread(sliderImage, 0)
        sliderWidth, sliderHeight = slider.shape[::-1]
    
        res = cv2.matchTemplate(bgGray, slider, cv2.TM_CCOEFF)
        a, b, c, d = cv2.minMaxLoc(res)
        # print(a,b,c,d)
        # 正常如下即可
        # return c[0] if abs(a) >= abs(b) else d[0]
        # 但是头条显示验证码的框跟验证码本身的像素不一致,所以需要根据比例计算
        if abs(a) >= abs(b):
            return c[0] * bgWidth / (bgWidth - sliderWidth)
        else:
            return d[0] * bgWidth / (bgWidth - sliderWidth)
    
    # 移动路径方法
    def getTrack(self, distance):
        '''
        Get the track by the distance
        :param distance: the distance of gap
        :return: list
        '''
        # 移动轨迹
        track = []
        # 当前位移
        current = 0
        # 减速阈值
        mid = distance * 4 / 5
        # 计算间隔
        t = 0.2
        # 初速度
        v = 0
    
        while current < distance:
            if current < mid:
                # 加速度为正2
                a = 2
            else:
                # 加速度为负3
                a = -3
            # 初速度v0
            v0 = v
            # 当前速度v = v0 + at
            v = v0 + a * t
            # 移动距离x = v0t + 1/2 * a * t^2
            move = v0 * t + 1 / 2 * a * t * t
            # 当前位移
            current += move
            # 加入轨迹
            track.append(round(move))
        return track
    
    
    # 滑动到缺口位置
    def moveToGap(self, track):
        '''
        Drag the mouse to gap
        :param track: the track of mouse
        :return: None
        '''
        ActionChains(self.driver).click_and_hold(self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[3]/div[2]/div[2]/div')).perform()
        while track:
            x = random.choice(track)
            ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
            track.remove(x)
        time.sleep(0.5)
        ActionChains(self.driver).release().perform()

    三、验证码的降噪

    • 验证码的降噪,只是为了处理验证码图像上的多余的线条和干扰线,让你后期识别更加的准确,提高识别的准确度
    • 第一步:可以进行灰度转化

    img = cv2.imread('yzm.png')
    # 将图片灰度化处理,降维,加权进行灰度化c
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('min_gray',gray)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • 第二步: 二值化处理

    import cv2
    
    img = cv2.imread('yzm.png')
    # 将图片灰度化处理,降维,加权进行灰度化c
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
    
    cv2.imshow('threshold',gray2)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    •  第三步:噪点过滤

    import cv2
    
    img = cv2.imread('yzm.png')
    # 将图片灰度化处理,降维,加权进行灰度化c
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
    
    def remove_noise(img, k=4):
        img2 = img.copy()
    
        #     img处理数据,k过滤条件
        w, h = img2.shape
    
        def get_neighbors(img3, r, c):
            count = 0
            for i in [r - 1, r, r + 1]:
                for j in [c - 1, c, c + 1]:
                    if img3[i, j] > 10:  # 纯白色
                        count += 1
            return count
    
        #     两层for循环判断所有的点
        for x in range(w):
            for y in range(h):
                if x == 0 or y == 0 or x == w - 1 or y == h - 1:
                    img2[x, y] = 255
                else:
                    n = get_neighbors(img2, x, y)  # 获取邻居数量,纯白色的邻居
                    if n > k:
                        img2[x, y] = 255
        return img2
    
    
    result = remove_noise(gray2)
    cv2.imshow('8neighbors', result)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    四、验证码的识别

    • 通常我们会使用tesserocr识别验证码,但是这个库有很大的局限性,识别率低,即时降噪效果很好,有很少的线条,也会不准确,这种识别方式并不十分推荐

    • 所以我们一般会使用第三方的接口进行识别,比如阿里的图片识别、腾讯也都是有的

    • 这些第三方接口需要自己接入识别接口

    #识别降噪后的图片
    code = tesserocr.image_to_text(nrImg)
    
    #消除空白字符
    code.strip()
    
    #打印
    print(code)
    展开全文
  • 描述了一种安全实用的Flash动态验证码,该验证码由ASP代码生成,在Flash中显示,通过Flash动画遮罩,在任一时刻只显示验证码一部分,变换验证码字体、颜色和增加背景噪音等手段增加验证码被自动识别的难度。
  • C#生成Gif动态验证码(源代码)

    热门讨论 2012-10-24 17:26:33
    生成动态的GIF,用于网站建设的验证码。 C#生成Gif Gif验证码 生成验证码 C#验证码
  • afl动态验证码生成器

    2014-10-14 23:05:43
    动态验证码生成器 可生成4位或6位验证码 即可纯数字,也可中英混合。 可用于邮件验证时等的动态验证码动态验证码未有有效时间,需要此功能,请另写个线程监测验证码发出失效,若超过时间可释放验证码储存变量。 ...
  • javascr动态验证码

    2022-02-14 20:50:11
    自行引入jquery就可以了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,814
精华内容 14,725
关键字:

动态验证码

友情链接: duilib-master (2).zip