java滚动验证码-前端和后端完整版

Java图片滑动验证码 一、配置文件 #验证码图片地址,需要改成你本地的地址 #路径调试的时候,配成全路径,不要配成相对路径。相对路径打成jar包的时候,读取不到文件 #这是前后端分离方式的调用,路径应该由服务器来配置,这里需要手动配置路径。其它方式读取文件,可自行调整CaptchaServiceImpl实现类中selectSlideVerificationCode方法文件读取方式 captcha: slide-verification-code: path: template-image: "/.. 阅读详情

java滚动验证码-前端和后端完整版

一、效果展示

在这里插入图片描述
实现原理:

  1. 背景图片是一张目标图片target,图片类型是jpg(在这里称之为target图片)。target图片透明部分是通过java代码实现的,并记录起想x,y 的坐标(目标位置)。
  2. 被抠出的图片是模板图片(templates图片),它的背景是透明的,只能看到抠图部分,图片类型是png。
  3. templates图片滑动的时候会随时产生相应的偏移量offsetHorizontal,当最终偏移量与目标位置x坐标相等时(可以设置一定的偏差),验证成功!

二、demo示例

背景: 新建springboot的demo
demo文件目录展示
在这里插入图片描述

1.后端

  1. VerifyImageUtil工具类
    该类编写主要是为了实现图片的抠图,坐标位置等对图片处理的功能,是实现图片滚动验证码的核心代码。
    代码解析:
            pictureTemplatesCut()方法是VerifyImageUtil类的入口函数,主要是初始化参数,首次加载滑块的两张图片,便是调用改方法(在controller层的创建滑块图片:createImgValidate()方法实现加载)。返回的pictureMap 集合是两张 效果处理的图片(背景图片:jpg 和 抠图模板: png)
package com.example.demo.util;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

/**
 * 滑块验证工具类
 * VerifyImageUtil
 */
public class VerifyImageUtil {

    /** 源文件宽度 */
    private static final int ORI_WIDTH = 600;
    /** 源文件高度 */
    private static final int ORI_HEIGHT = 300;
    /** 抠图坐标x */
    private static int X;
    /** 抠图坐标y */
    private static int Y;
    /** 模板图宽度 */
    private static int WIDTH;
    /** 模板图高度 */
    private static int HEIGHT;

    public static int getX() {
        return X;
    }

    public static int getY() {
        return Y;
    }

    /**
     * 根据模板切图
     * @param templateFile 模板文件
     * @param targetFile 目标文件
     * @param templateType 模板文件类型
     * @param targetType 目标文件类型
     * @return 切图map集合
     * @throws Exception 异常
     */
    public static Map<String, byte[]> pictureTemplatesCut(File templateFile, File targetFile, String templateType, String targetType) throws Exception {
        Map<String, byte[]> pictureMap = new HashMap<>(2);

        InputStream targetIs = new FileInputStream(targetFile);
        // 模板图
        BufferedImage imageTemplate = ImageIO.read(templateFile);
        WIDTH = imageTemplate.getWidth();
        HEIGHT = imageTemplate.getHeight();
        // 随机生成抠图坐标
        generateCutoutCoordinates();
        // 最终图像
        BufferedImage newImage = new BufferedImage(WIDTH, HEIGHT, imageTemplate.getType());
        Graphics2D graphics = newImage.createGraphics();
        graphics.setBackground(Color.white);

        int bold = 5;
        // 获取感兴趣的目标区域
        BufferedImage targetImageNoDeal = getTargetArea(X, Y, WIDTH, HEIGHT, targetIs, targetType);

        // 根据模板图片抠图
        newImage = dealCutPictureByTemplate(targetImageNoDeal, imageTemplate, newImage);

        // 设置“抗锯齿”的属性
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        graphics.setStroke(new BasicStroke(bold, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
        graphics.drawImage(newImage, 0, 0, null);
        graphics.dispose();

        //模板图像矩阵 加阴影边框
        //boundaryShadow(newImage);

        //新建流。
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //利用ImageIO类提供的write方法,将bi以png图片的数据模式写入流。
        ImageIO.write(newImage, "png", os);
        byte[] newImages = os.toByteArray();
        pictureMap.put("newImage", newImages);

        // 源图生成遮罩
        BufferedImage oriImage = ImageIO.read(targetFile);
        byte[] oriCopyImages = dealOriPictureByTemplate(oriImage, imageTemplate, X, Y);
        pictureMap.put("oriCopyImage", oriCopyImages);
        System.out.println("X="+X+";y="+Y);
        return pictureMap;
    }

    /**
     * 抠图后原图生成
     * @param oriImage 原始图片
     * @param templateImage 模板图片
     * @param x 坐标X
     * @param y 坐标Y
     * @return 添加遮罩层后的原始图片
     * @throws Exception 异常
     */
    private static byte[] dealOriPictureByTemplate(BufferedImage oriImage, BufferedImage templateImage, int x,
                                                   int y) throws Exception {
        // 源文件备份图像矩阵 支持alpha通道的rgb图像
        BufferedImage oriCopyImage = new BufferedImage(oriImage.getWidth(), oriImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        // 源文件图像矩阵
        int[][] oriImageData = getData(oriImage);
        // 模板图像矩阵
        int[][] templateImageData = getData(templateImage);

        //copy 源图做不透明处理
        for (int i = 0; i < oriImageData.length; i++) {
            for (int j = 0; j < oriImageData[0].length; j++) {
                int rgb = oriImage.getRGB(i, j);
                int r = (0xff & rgb);
                int g = (0xff & (rgb >> 8));
                int b = (0xff & (rgb >> 16));
                //无透明处理
                rgb = r + (g << 8) + (b << 16) + (240 << 24);
                oriCopyImage.setRGB(i, j, rgb);
            }
        }

        for (int i = 0; i < templateImageData.length; i++) {
            for (int j = 0; j < templateImageData[0].length - 5; j++) {
                int rgb = templateImage.getRGB(i, j);
                //对源文件备份图像(x+i,y+j)坐标点进行透明处理(被抠图的阴影部分)
                if (rgb != 16777215 && rgb <= 0) {
                    int rgb_ori = oriCopyImage.getRGB(x + i, y + j);
                    int r = (0xff & rgb_ori);
                    int g = (0xff & (rgb_ori >> 8));
                    int b = (0xff & (rgb_ori >> 16));
                    rgb_ori = r + (g << 8) + (b << 16) + (70 << 24);
                    oriCopyImage.setRGB(x + i, y + j, rgb_ori);
                } else {
                    //do nothing
                }
            }
        }
        //新建流
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //利用ImageIO类提供的write方法,将bi以png图片的数据模式写入流
        ImageIO.write(oriCopyImage, "png", os);
        //从流中获取数据数组
        return os.toByteArray();
    }

    /**
     * 根据模板图片抠图
     * @param oriImage 原始图片
     * @param templateImage 模板图片
     * @return 扣了图片之后的原始图片
     */
    private static BufferedImage dealCutPictureByTemplate(BufferedImage oriImage, BufferedImage templateImage,
                                                          BufferedImage targetImage) throws Exception {
        // 源文件图像矩阵
        int[][] oriImageData = getData(oriImage);
        // 模板图像矩阵
        int[][] templateImageData = getData(templateImage);

        System.out.println("shi:" + templateImageData.length);
        // 模板图像宽度
        for (int i = 0; i < templateImageData.length; i++) {
            // 模板图片高度
            for (int j = 0; j < templateImageData[0].length; j++) {
                // 如果模板图像当前像素点不是白色 copy源文件信息到目标图片中
                int rgb = templateImageData[i][j];
                if (rgb != 16777215 && rgb <= 0) {
                    targetImage.setRGB(i, j, oriImageData[i][j]);
                }
            }
        }
        return targetImage;
    }

    /**
     * 获取目标区域
     * @param x            随机切图坐标x轴位置
     * @param y            随机切图坐标y轴位置
     * @param targetWidth  切图后目标宽度
     * @param targetHeight 切图后目标高度
     * @param ois          源文件输入流
     * @return 返回目标区域
     * @throws Exception 异常
     */
    private static BufferedImage getTargetArea(int x, int y, int targetWidth, int targetHeight, InputStream ois,
                                               String fileType) throws Exception {
        Iterator<ImageReader> imageReaderList = ImageIO.getImageReadersByFormatName(fileType);
        ImageReader imageReader = imageReaderList.next();
        // 获取图片流
        ImageInputStream iis = ImageIO.createImageInputStream(ois);
        // 输入源中的图像将只按顺序读取
        imageReader.setInput(iis, true);

        ImageReadParam param = imageReader.getDefaultReadParam();
        Rectangle rec = new Rectangle(x, y, targetWidth, targetHeight);
        param.setSourceRegion(rec);
        return imageReader.read(0, param);
    }

    /**
     * 生成图像矩阵
     * @param bufferedImage 图片流
     * @return 图像矩阵
     */
    private static int[][] getData(BufferedImage bufferedImage){
        int[][] data = new int[bufferedImage.getWidth()][bufferedImage.getHeight()];
        for (int i = 0; i < bufferedImage.getWidth(); i++) {
            for (int j = 0; j < bufferedImage.getHeight(); j++) {
                data[i][j] = bufferedImage.getRGB(i, j);
            }
        }
        return data;
    }

    /**
     * 随机生成抠图坐标
     */
    private static void generateCutoutCoordinates() {
        Random random = new Random();
        int widthDifference = ORI_WIDTH - WIDTH;
        int heightDifference = ORI_HEIGHT - HEIGHT;

        if (widthDifference <= 0) {
            X = 5;
        } else {
            X = random.nextInt(ORI_WIDTH - 3*WIDTH) + 2*WIDTH + 5;
        }

        if (heightDifference <= 0) {
            Y = 5;
        } else {
            Y = random.nextInt(ORI_HEIGHT - HEIGHT ) + 5;
        }

        NumberFormat numberFormat = NumberFormat.getInstance();
        numberFormat.setMaximumFractionDigits(2);
    }
}



  1. ImgValidateController 类
    ImgValidateController 控制器方法实现为了方便前端的调用。
    代码解析:
          createImgValidate() 方法初始化加载图片。传入原始的本地图片,通过工具类的方法处理图片并返回给前端。
          checkImgValidate() 方法通过前端传入的偏移量offsetHorizontal与target图片中的x坐标对比,判断是否验证成功。
package com.example.demo.controller;

import com.example.demo.util.VerifyImageUtil;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Controller
@RequestMapping(value = "imgVerify")
public class ImgValidateController {

    /**
     * 跳转前台 图片滑块验证码 页面
     */
    @RequestMapping(value = "imgValidate")
    public String toImgValidate() {
        return "imageValidate";
    }

    /**
     * 创建滑块图片
     */
    @RequestMapping(value = "createImgValidate")
    @ResponseBody
    public Map<String, byte[]> createImgValidate(){
        Map<String, byte[]> resultMap = new HashMap<>();
        try{
            Integer templateNum = new Random().nextInt(4) + 1;
            Integer targetNum = new Random().nextInt(1) + 1;

            File templateFile = ResourceUtils.getFile("classpath:static/images/template/"+templateNum+".png");
            File targetFile = ResourceUtils.getFile("classpath:static/images/target/"+targetNum+".jpg");
            resultMap =  VerifyImageUtil.pictureTemplatesCut(templateFile, targetFile,"PNG","JPG");
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }

        return resultMap;
    }

    /**
     * 校验 滑动验证码是否正确
     */
    @RequestMapping(value = "checkImgValidate")
    @ResponseBody
    public boolean checkImgValidate(int offsetHorizontal){
        boolean flag = false;
        int x = VerifyImageUtil.getX()+67;
        if(offsetHorizontal > x - 5 && offsetHorizontal < x + 5 ){
            flag = true;
            return flag;
        }
        return flag;
    }


}

2.前端

1.imageValidate.html页面
在pom.xml中需用引入thymeleaf 的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>图片验证</title>
    <link rel="stylesheet" type="text/css" th:href="@{/css/bootstrap.min.css}" />
    <link rel="stylesheet" type="text/css" th:href="@{/css/imageValidate.css}" />
</head>
<body>
<div id="container">
    <div class="imageDiv">
        <img id="validateImage" src=""/>
        <img id="slideImage" src=""/>
    </div>
    <div class="resultDiv">
        <button class="btn btn-success" onclick="exchange();">换一组</button>
        <span id="operateResult"></span>
    </div>
    <div>
        <div id="sliderOuter">
            <div id="dragDiv">拖动滑块完成拼图</div>
            <div id="sliderInner">
               <!-- <div class="coverIcon">滑动条</div>-->
            </div>
        </div>
    </div>
</div>

</body>
<script type="text/javascript" th:src="@{/jquery-3.4.0.min.js}" ></script>
<script type="text/javascript" th:src="@{/imageValidate.js}" ></script>
</html>
  1. imageValidate.css
    给imageValidate.html页面加入基本的显示效果。
body{
    overflow: hidden;
}
#container{
    width: 100%;
}
.fontDiv{
    margin: 16px 0;
}
.dragFont{
    font-size: 16px;
    color: dodgerblue;
}
.imageDiv{
    width: 600px;
    height: 300px;
    margin: 20px auto 0 auto;
    position: relative;
}
.resultDiv{
    margin: 10px 20px;
}
#validateImage{
    border-radius: 4px;
}
#slideImage{
    position: absolute;
    top: 5px;
    left: 0;
}
#sliderOuter{
    width: 600px;
    height: 40px;
    margin: 12px auto;
    border-radius: 20px;
    box-shadow: 0 0 10px 5px darkgrey;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
}
#dragDiv{
    width: 100%;
    height: 40px;
    position: absolute;
    font-size: 16px;
    color: dodgerblue;
    text-align: center;
    line-height: 40px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
#sliderInner{
    width: 94px;
    height: 40px;
    border-radius: 20px;
    font-size: 2rem;
    background-color: #28a745;
    cursor: pointer;
    position: absolute;
    left: 0;
}
/*
#sliderInner i{
    position: relative;
    top: -2px;
    left: 36px;
    color: white;
}
.coverIcon{
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
}*/

  1. imageValidate.js
    显示滑动验证吗的前端逻辑。initImageValidate()初始化加载图片。checkImageValidate()判断验证是否成功。
var left = 0;

$(function(){
    // 初始化图片验证码
    initImageValidate();

    /* 初始化按钮拖动事件 */
    // 鼠标点击事件
    $("#sliderInner").mousedown(function(){
        // 鼠标移动事件
        document.onmousemove = function(ev) {
            left = ev.clientX;
            if(left >= 67 && left <= 573){
                $("#sliderInner").css("left",(left-67)+"px");
                $("#slideImage").css("left",(left-67)+"px");
            }
        };
        // 鼠标松开事件
        document.onmouseup=function(){
            document.onmousemove=null;
            checkImageValidate();
        };
    });

});

function initImageValidate(){
    $.ajax({
        async : false,
        type : "POST",
        url : "/imgVerify/createImgValidate",
        dataType: "json",
        data:{
        },
        success : function(data) {
            //console.log(data);
            if(data){
                $("#validateImage").attr("src", "data:image/png;base64,"+data.oriCopyImage);
                $("#slideImage").attr("src", "data:image/png;base64,"+data.newImage);
            }else {
                console.log("初始化出错!!");
            }
        },
        error : function() {}
    });
}

function exchange(){
    initImageValidate();
}

// 校验
function checkImageValidate(){
    $.ajax({
        async : false,
        type : "POST",
        url : "/imgVerify/checkImgValidate",
        dataType: "json",
        data:{
            offsetHorizontal:left
        },
        success : function(data) {
            //console.log("data:"+data);
            if(data == true){
                $("#operateResult").css("color","#28a745");
                alert("验证成功");
            }else{
                $("#operateResult").css("color","#dc3545");
                // 验证未通过,将按钮和拼图恢复至原位置
                $("#sliderInner").animate({"left":"0px"},200);
                $("#slideImage").animate({"left":"0px"},200);
                alert("验证失败请重试");
            }
        },
        error : function() {}
    });
}

附代码下载

链接 https://pan.baidu.com/s/1d9UQkmj3I1P1YR-T118UFQ
提取码: z82v

Java验证码工具包:文字点选+滑动拼图双模式,带Spring Boot自动装配与Redis/AES安全支持 一套即插即用的Java人机验证组件,支持两种主流交互方式:用户点击图片中指定中文文字完成验证,或拖动缺块拼图至正确位置完成匹配。后端基于Spring Boot 2.1.17开发,兼容JDK 1.8,图形生成全部使用AWT原生API(BufferedImage + Graphics2D),包含中文字体随机渲染、文字位置扰动、抠图合成等抗识别处理。前端自动适配浏览器滚动偏移和缩放比例,确保坐标采集准确;所有用户操作坐标均经AES加密传输,防止中间篡改。提供两个独立可运行Demo(click-captcha-de 阅读详情

相关推荐

java实现图片滑动验证(包含前端代码)

主要为大家详细介绍了Java实现图片滑动验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前后端滑块验证码实例附源码(java jquery)

背景: 发送短信验证码或者登录等场景操作之前都需要进行图片验证码校验或者滑块验证码校验;此举是为了减少黑盒对服务端进行暴力破解密码或者频发短信轰炸请求的操作; 但如果滑块验证完全由前端进行操作,实际上是不能很好的进行黑盒测试的防御,很容易绕过,所以在这里推出一个前后端结合滑块验证码的实例; 步骤: 后台生成背景图+模版抠图+抠图横坐标+抠图纵坐标; 后台生成...

叶落自飘零的博客 6933

紫光同创PDS软件操作指南:如何为FPGA新增自定义Flash型号

本文详细介绍了在紫光同创PDS软件中为FPGA新增自定义Flash型号的完整操作指南。针对官方支持列表之外的SPI Flash芯片,文章从理解FPGA配置逻辑入手,逐步讲解如何通过扫描Flash ID、在Flash Operator中精准填写参数、转换.sbit文件,最终完成固化的全过程,并分享了高级技巧与常见问题排查方法,帮助工程师摆脱对预设型号的依赖,实现灵活选型。

weixin_29204749的博客 325

图形滑动验证码JAVA实现【前后端结合】

一、为什么要验证码? 防暴力破解的课题一直是信息安全的重点,漏洞攻击更是开发者的噩梦。。。。 如果没有经历过这个噩梦,请感受一下被信安部门支配的恐惧。(一大堆漏洞给扫出来,您修代码吧) 二、怎么实现的? 前端:HTML+JS+CSS 开源组件:Layui 后端:Java 后端框架:SpringBoot 思路: 后端随机读取一张图片,利用算法随机“抠图”,返回base64码值到前端 前端读取到base...

J.R.Leonardo的博客 1万+

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3039

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

Java 后端、滑块验证码实现 亲测可用(项目不同需要小改)

因为是基于Mybatis-plus来进行多数据源切换的,所以先导入mybatis-plus的多数据源pom <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.1</version> </dependenc...

Wcybaonier 1719

华大 HC32F460 DMA数据传输实战:从配置到中断处理的完整指南

本文提供了华大半导体HC32F460微控制器DMA(直接内存访问)功能的完整实战指南。详细解析了DMA的配置流程、中断处理机制以及软件与硬件触发方式,并附有实验代码示例。通过合理使用DMA进行数据传输,可以显著解放CPU资源,提升嵌入式系统的实时性与运行效率。

weixin_29194255的博客 255

登录校验之滑块验证码完整实现(vue + springboot)

嗨,大家好,我是希留。验证码一直是各类网站登录和注册的一种校验方式,是用来防止有人恶意使用脚本批量进行操作从而设置的一种安全保护方式。随着近几年技术的发展,人们对于系统安全性和用户体验的要求越来越高,大多数网站系统都逐渐采用行为验证码来代替传统的图片验证码。今天这篇文章就来记录一下,我是如何实现从前端、到后端校验的整个流程的。

Java升级之路的博客 2万+

安全与加密常识(10)linux系统证书管理

1. 将自定义CA证书(如my-ca.crt)放到源目录# 2. 编辑配置文件,启用该证书(末尾添加一行 my-ca.crt)# 3. 执行命令同步(核心工作环节)# 4. 验证结果:检查是否生成哈希链接和合并到证书束ls /etc/ssl/certs/my-ca.pem # 证书文件ls /etc/ssl/certs/$(openssl x509 -hash -noout -in /usr/share/ca-certificates/my-ca.crt).0 # 哈希链接。

二进制君 283

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 313

Java实现点击中文文字图片验证码

Java实现点击中文文字图片验证码 环境条件 JDK1.8 MAVEN-3.3 spring-boot-2.1.17.RELEASE 点击中文文字验证码思路(跟点击图标思路一致,只是背景图写文字改为画图标) 文件夹放置尺寸大小一致的背景图,支持可配置的文件夹路径和容错的默认路径. 项目启动完成时一次性全部图片转为字节或Base64缓存起来(可改为redis);前端请求图片验证码时候在随机取缓存中的一张背景图片。 根据配置生成固定个数的随机宋体中文文字(记住LINUX得安装宋体字库),在根

m0_38138879的博客 2347

《AgentScope-Java 深入浅出教程》第8章 工具高级特性

掌握工具组、预设参数、执行上下文等高级特性。

步子哥的博客 265

前端验证码验证实战指南:滑块、图片、点选与移动端验证完整实现

本文系统讲解前端验证码验证的常见方式与项目落地方案,涵盖图片数字验证码、数学计算验证码、滑块验证、移动端手势验证、图片点选验证和无感验证等类型。内容从验证码的安全作用、前后端交互流程、接口设计、Token 与 Ticket 校验机制讲起,并结合 JavaScript、Vue、React 前端代码,以及 Java Spring Boot、PHP 后端实现示例,帮助开发者理解验证码如何防刷、防爆破、防恶意提交。同时整理常用组件、第三方验证码服务和实战注意事项,适合前端开发、全栈开发和后台系统安全加固参考。

zzwokstyle的博客 898

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 286

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

基于Java的图片点选汉字验证码的实现,以及Js配置

前端运行效果如下: 代码片 Jsp &amp;lt;!-- 图片点选汉字验证码 --&amp;gt; &amp;lt;section id=&quot;captcha_sec&quot; class=&quot;input-container&quot; style=&quot;display: none;&quot; &amp;gt; &amp;lt;spring:mes

Yoyo_Yan的博客 3360

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用阿里云的滑动验证码完成登陆注册

关于滑动验证码的作用这里就不说了,应该都知道,下面就开始叙述一下怎样使用阿里云的滑动验证码。 这是阿里云滑动验证码的样式 (如果觉得不好看。还可以自己自定义样式) 第一步 登陆阿里云账号 登陆阿里云账号,进入控制台首页,在这里 第二步 新增配置 新增配置 按照步骤填写对应的值,点击下一步,就会看到有文档指引,一段前端代码,还有对应语言版本的SDK,以及代码示例,这里下载java版本的SDK,...

qq_44778026的博客 2718

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CSU前端网站 +登陆系统

实现CSU网站主页,并设计并实现一个简单全栈登陆系统;实现要求短信验证码实现:臻子云;实现要求:1)前端页面的基本布局 布局类似于学校门户 顶部需有 LOGO 栏目;提供轮播图;提供账号密码登录方式;提供手机号码(邮箱)+ 动态验证码登录方式;登录成功后跳到类似CSU主页,并显示登陆用户;*提供忘记密码和修改密码功能;*提供用户的增删改查;2)完成前后端数据交互;3)数据操作要求:数据统一存储在后端数据库中;账号密码登录方式需进行验证,验证通过方能登录; 后端实现技术不限、数据库系统不限

JRcoder 866

Java验证码安全架构:从行为分析到令牌校验的终极解决方案

验证码(CAPTCHA)作为网络安全的基础防线,其核心原理是通过人机交互差异来识别自动化攻击。传统图形验证码因易被OCR破解而逐渐失效,现代技术转向行为分析与风险评估,通过采集鼠标轨迹、点击动力学等特征构建人机识别模型。其技术价值在于实现无感验证,在保障安全的同时优化用户体验。应用场景涵盖用户注册、登录、交易确认等关键操作防护。本文以“天爱验证码”为例,深入解析其多模态挑战生成、动态策略调整及后端驱动的安全闭环设计,其中令牌(Token)机制与行为分析引擎的结合,为Java应用提供了企业级安全验证能力。

weixin_29323273的博客 286

行为式验证码技术解析:滑块拼图、语序选词与智能无感知

摘要: 行为式验证码因传统字符验证码易被攻破而兴起,结合用户操作、环境信息与风控模型,兼顾安全与体验。主流实现包括:1)滑块拼图(拖动轨迹验证,中低难度);2)语序选词(防OCR,中等安全);3)智能无感知(多维度风控评分,高安全但需隐私合规)。应用场景依安全需求递增,未来趋势将向多模态对抗、AI博弈及零交互验证发展,形成动态智能防线。

智造编程 1919

Java开发必备

拓展 文章目录拓展拓展一:jdk1.8循环list集合拓展二:加密拓展三:反编译,查看源代码拓展四:响应式写法拓展五:简历模板(HTML)(自适应)拓展六:手机端拓展七:ajax参数拓展八:Html滚动拓展九:页面组装(电脑端)拓展十:前端布局拓展十一:oracle报错ora-01033拓展十二:SpringBoot验证码导航栏 拓展一:jdk1.8循环list集合 jdk1.8中的循环list集合可以更换方式 List<String> list=new ArrayList<String

qq_41498751的博客 218

企业级行为验证码技术方案深度解析与实战指南

行为验证码(Behavioral CAPTCHA)的出现,标志着人机识别技术从“静态挑战”向“动态感知”的演进升级。本文将深入剖析行为验证码的技术原理、主流方案对比,并结合实际代码演示如何在项目中快速接入,帮助开发者构建更加安全、用户体验更佳的验证体系。

HjMUhK901996的博客 1736

Jeecg-Boot 2.0.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

Jeecg-Boot 2.0.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

JEECG官方博客 7113

java iframe 刷新_iframe实现局部刷新和回调(转)

当验证码或者用户名存在的时候。在后台弹窗提示。可页面原本file里面符合要求的值刷新没了。用户体验不好。因为用ifream刷新技术已不是什 么新鲜技术。所以网上有大把的资料可参考。只是因为本人是初次接触。所以记下自己的知识点。当成长经历。对于入门的我们先来全名了解下。什么是iframeIframe是Inline Frame的缩写,称为内联框架(即行内框架)。看着很眼熟吧,对了,它有个近亲可是大名...

weixin_39989222的博客 434

带有随机验证码的登录页面

该功能的完整实现,共有三个页面,分别为:login.jsp和checkCode.jsp以及checkLogin.jsp 以下是login.jsp页面的代码,它主要负责录入登录信息 &lt;%@ page pageEncoding="UTF-8"%&gt; &lt;script language="javascript"&gt; function loginSubmit(){ var...

tanzi21的博客 184

前端也能做爬虫?用 JS+Puppeteer 爬取数据,亲测有效

从技术架构上看,Puppeteer 基于 Chrome DevTools 协议,能直接操控 Chromium 浏览器,既可以运行在 Node.js 环境中作为后端服务,也能通过 Electron 等框架打包成桌面工具,这种灵活性让前端开发者在爬虫领域有了更多发挥空间。JS+Puppeteer 的组合为前端开发者打开了爬虫领域的大门,凭借对动态页面的强大处理能力和贴近前端开发习惯的语法,成为处理复杂爬取需求的理想选择。要使用 JS+Puppeteer 进行爬虫开发,首先需要搭建基础环境,步骤如下:​。

2509_93051135的博客 1249
上一篇: solr 连接MySQL数据库
下一篇: Spring Boot 整合 Jsp
outdata
博客等级 码龄10年 7粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值