成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Springboot3.x 中實現滑動拼圖驗證碼的全面指南

開發 前端
引入滑動拼圖驗證碼,可以有效增強你的網站對惡意機器人的防護能力,從而提高用戶數據的安全性。同時,這種方式也很友好,用戶體驗良好,是一種十分實用的人機交互方式。
這個專題深入淺出地探討了各類驗證碼的生成和在Springboot3.x中的實踐,從基礎的滑動、點選、算術運算驗證碼到創新的藝術風格、水印、二維碼驗證碼,適合所有Java開發者閱讀。在這個專題中,不僅可以學習到技術實踐,更能領略到驗證碼的美學魅力。讓我們一起探索驗證碼的無盡可能性。

滑動拼圖驗證碼作為用戶身份驗證的一種方式,它的主要作用是進行人機行為區分,防止針對網站或者應用的惡意機器行為。這種驗證碼尤其適用于防止惡意的批量注冊、登錄爬蟲以及自動化攻擊,比如說防止一些驗證碼識別的機器人。

基本的滑動拼圖驗證碼通常由一個背景圖像和一個缺失的圖像片段組成,用戶需要通過鼠標操作將缺失的片段準確滑動至應在的位置。在這個過程中,用戶的行為數據(包括滑動軌跡,滑動速度,滑動時間等)都可以被用來進行用戶和機器的區分,因此滑動拼圖驗證碼又有著非常高的安全性。

與傳統的文本驗證碼相比,滑動拼圖驗證碼具有更好的用戶體驗和更高的安全性:文本驗證碼往往需要用戶仔細觀察,輸入錯誤率高,給用戶帶來不便,而且現在有許多OCR技術可以成功識別文本驗證碼。滑動拼圖驗證碼則只需要用戶執行一個自然的,直覺的動作,用戶錯誤率低,同時機器人模擬出人類完全一致的行為幾乎是不可能的。

理解原理:滑動拼圖驗證碼的運行機制

滑動拼圖驗證碼的運行包括了后端服務和前端交互兩大部分,我們先來知道整體的流程,再逐一深入。

  1. 后端生成圖像:后端首先生成一張完整的圖像和一個帶有缺口的復制圖像。這個缺口通常是一個特定的形狀,如圓形、方形等,或者是一段特定輪廓的形狀。這樣就形成了一對背景圖像和滑塊圖像,缺口的形狀和大小在這兩張圖像中是完全一致的。
  2. 前端展示與交互:后端將這兩張圖像發送給前端,前端將背景圖像正常展示,而滑塊圖像則位于一邊,等待用戶進行拖動。
  3. 用戶操作滑塊:用戶通過鼠標或觸屏操作,將滑塊圖像拖動至背景圖像中的缺口部分。在這個操作過程中,前端會記錄下用戶的行為數據,這些數據包括但不限于滑動開始和結束的時間、滑動軌跡、滑動速度等。
  4. 前端發送驗證數據:當用戶完成拖動后,或者用戶拖動滑塊超出一定范圍后,前端將滑動的結果以及行為數據發送給后端。這個結果就是滑塊在背景圖像中的位置,或者說是滑動的距離。
  5. 后端驗證:后端根據發送來的滑動結果,以及用戶的行為數據,進行驗證。如果滑動結果與后端最初設定的缺口位置一致,或者在一定的誤差范圍內,同時用戶的行為數據也符合正常人類的行為,那么后端判定這次驗證碼驗證成功,返回驗證成功的結果。

技術實現:在Springboot3.x中如何生成滑動拼圖驗證碼

下面我們將實現一個簡單的 Spring Boot 工程來生成滑動拼圖驗證碼。我們的項目中主要包括四個部分,分別為原始圖片的獲取,將原始圖片轉換為帶缺口的滑動驗證碼圖片,前端的驗證碼顯示和操作以及后端的數據驗證。

后端:生成滑動拼圖驗證碼

我們首先需要一個原始圖片,這個圖片將會被轉換為驗證碼圖片。原始圖片可以是任何圖片文件,例如originalImage.png,存放在項目的資源文件夾中。

后端用來生成驗證碼的核心代碼如下:

@RestController
public class ImageController {

    private final ImageService imageService;

    public ImageController(ImageService imageService) {
        this.imageService = imageService;
    }

    @GetMapping("/captcha")
    public ResponseEntity<byte[]> getCaptcha(HttpSession session) throws IOException {
        BufferedImage captchaImage = imageService.createCaptchaImage();
        session.setAttribute("captcha", imageService.getCaptchaPosition());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(captchaImage, "png", baos);
        byte[] imageInByte = baos.toByteArray();

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE)
                .body(imageInByte);
    }

    @PostMapping("/validate")
    public boolean validateCaptcha(@RequestParam int position, HttpSession session) {
        Integer captchaPosition = (Integer) session.getAttribute("captcha");
        if (captchaPosition != null) {
            return Math.abs(captchaPosition - position) <= 5;
        }
        return false;
    }
}

在這段代碼中,/captcha路由用來生成驗證碼圖片并返回給前端,生成的驗證碼圖片是一個PNG格式的圖片。同時,將驗證碼圖片中缺口的位置保存在session中,用來進行后續的驗證。/validate路由用來驗證用戶的操作是否正確。

ImageService 類

import org.springframework.stereotype.Service;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Paths;
import javax.imageio.ImageIO;
import java.util.Random;

@Service
public class ImageService {

    private int captchaPosition;

    public BufferedImage createCaptchaImage() throws IOException {
        BufferedImage originalImage = readImageFromResources();
        captchaPosition = generateRandomCaptchaPosition(originalImage.getWidth());

        BufferedImage captchaImage = new BufferedImage(
                originalImage.getWidth(),
                originalImage.getHeight(),
                originalImage.getType());

        int pieceWidth = originalImage.getWidth() / 8;

        // 繪制原始圖像
        Graphics2D graphics2D = captchaImage.createGraphics();
        graphics2D.drawImage(originalImage, 0, 0, null);

        // 在原始位置繪制一個帶形狀的片段
        graphics2D.setComposite(AlphaComposite.Clear);
        graphics2D.fillRoundRect(captchaPosition, captchaImage.getHeight() / 2, pieceWidth, pieceWidth, 10, 10);
        graphics2D.dispose();

        return captchaImage;
    }

    private BufferedImage readImageFromResources() throws IOException {
        InputStream inputStream = getClass().getResourceAsStream(Paths.get("path_to_resources", "originalImage.png").toString());
        return ImageIO.read(inputStream);
    }

    private static int generateRandomCaptchaPosition(int width) {
        Random random = new Random();
        return random.nextInt(width / 2) + width / 4; // 將片段定位到圖像的中央位置
    }

    public int getCaptchaPosition() {
        return captchaPosition;
    }
}

這個 ImageService 類實現了 createCaptchaImage 方法,這個方法可以生成一個滑動拼圖驗證碼。首先,它讀取了一個原始的圖像文件,然后隨機生成了一個驗證碼的位置。接著,它創建了一個新的 BufferedImage 對象,將原始圖像繪制到了這個新的對象上,然后在驗證碼位置上繪制了一個透明的缺口。

前端:驗證碼的顯示和操作

前端使用HTML和JavaScript來顯示驗證碼圖片和處理用戶的操作。核心代碼如下:

<img id="captcha" src="api/captcha" />
<div id="slider"><div id="knob"></div></div>

<script>
  const slider = document.getElementById('slider');
  const knob = document.getElementById('knob');
  knob.onmousedown = function(event) {
    event.preventDefault();
    let shiftX = event.clientX - knob.getBoundingClientRect().left;
    document.addEventListener('mousemove', onMouseMove);
    document.addEventListener('mouseup', onMouseUp);

    function onMouseMove(event) {
      let newLeft = event.clientX - shiftX - slider.getBoundingClientRect().left;
      if (newLeft < 0) newLeft = 0;
      let rightEdge = slider.offsetWidth - knob.offsetWidth;
      if (newLeft > rightEdge) newLeft = rightEdge;
      knob.style.left = newLeft + 'px';
    }

    function onMouseUp() {
      document.removeEventListener('mouseup', onMouseUp);
      document.removeEventListener('mousemove', onMouseMove);
      validateCaptcha(parseInt(knob.style.left));
    }
  };
  knob.ondragstart = function() { return false; }

  function validateCaptcha(position) {
    fetch('api/validate?position=' + position, {method: 'POST'})
      .then(response => response.json())
      .then(data => { /* process the validation result */ });
  }
</script>

在這段代碼中,顯示驗證碼的元素從后端請求驗證碼圖片。滑動條(<div id="slider">)和滑塊(<div id="knob">)用來讓用戶進行操作。當用戶按下滑塊時,開始記錄滑塊的位置,當用戶釋放滑塊時,將滑塊的位置發送給后端進行驗證。

實戰應用:滑動拼圖驗證碼的應用示例

滑動拼圖驗證碼是一種常見的人機驗證工具,主要用于區別用戶是人還是機器人。其操作方式通常是,用戶通過拖動滑塊,將一個圖形拼圖從初始位置移動到一個預定的位置,如此一來,系統就可以通過這種操作行為來判斷用戶是否為人類。下面是一個具體的應用示例:

假如你正在構建一個網站,希望在用戶注冊或登錄時,通過滑動拼圖驗證碼來增強系統的安全防護。在用戶填寫完用戶名和密碼后,必須要求他們通過滑動拼圖驗證碼的驗證,才能進一步操作。

  1. 用戶首先訪問你的網站,并點擊注冊或登錄按鈕。
  2. 用戶在相應的輸入框內填入用戶名和密碼。
  3. 此時,網站會顯示出一個滑動拼圖驗證碼,同時,網站也會提示用戶需要通過拖動滑塊,將拼圖移動到正確的位置。
  4. 用戶根據提示操作,移動滑塊,將拼圖還原到指定位置。
  5. 用戶成功完成滑動拼圖驗證碼后,就可以繼續注冊或登錄操作。

引入滑動拼圖驗證碼,可以有效增強你的網站對惡意機器人的防護能力,從而提高用戶數據的安全性。同時,這種方式也很友好,用戶體驗良好,是一種十分實用的人機交互方式。

本文詳細而深入地介紹了滑動拼圖驗證碼的工作原理及其在實戰中的應用。文章首先解釋了什么是滑動拼圖驗證碼,它如何幫助識別用戶是否為人類,提高系統的安全性。然后,文章通過一個具體的實例,詳細地描述了如何在用戶注冊和登錄的過程中,使用滑動拼圖驗證碼增強網站的安全防護能力。總結而言,滑動拼圖驗證碼是一種有效且用戶體驗良好的防護機制,能夠針對惡意機器人采取防護措施,提高用戶數據的安全性。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-05-14 08:16:13

Spring驗證碼系統

2024-05-06 08:45:25

Spring分布式日志

2024-05-11 08:10:10

2024-06-03 08:38:41

考試系統識別

2024-06-26 19:06:04

2015-09-21 15:31:05

php實現驗證碼

2013-06-19 10:19:59

2024-05-13 08:06:22

Spring消息隊列物聯網

2024-05-06 08:47:26

Spring框架二維碼

2009-11-26 10:48:59

PHP驗證碼

2009-11-23 16:59:23

PHP圖形驗證碼

2021-01-19 10:29:34

短信驗證碼密碼

2022-02-11 07:10:15

驗證碼

2009-12-16 15:46:41

Ruby on rai

2020-11-16 07:28:53

驗證碼

2024-05-29 09:03:26

2011-11-02 12:43:33

2023-12-08 08:02:40

開箱React?組件

2009-06-26 15:17:27

jQuery
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人手机在线 | 91精品国产综合久久婷婷香蕉 | 日韩at| 欧洲视频一区二区 | 国产视频一区二区 | 日韩午夜网站 | 欧美在线一区二区三区 | 国产在线播 | 国产精品1区2区3区 欧美 中文字幕 | 中文字幕第一页在线 | 99九九久久 | 成年视频在线观看 | 在线观看视频一区二区三区 | 黄网站免费入口 | 亚洲精品丝袜日韩 | 国产午夜精品一区二区三区嫩草 | 亚洲二区视频 | 欧美亚洲一区二区三区 | 尹人av | 91免费视频观看 | 国产精品久久亚洲 | 黄视频免费 | 婷婷久久综合 | 欧美精品综合 | 国产精品美女www爽爽爽视频 | 成人精品国产免费网站 | 日韩一区二区三区av | 91精品国产高清久久久久久久久 | 日韩精品在线一区 | 91久久精品日日躁夜夜躁国产 | 久久综合狠狠综合久久综合88 | 国产免费av在线 | 免费性视频 | 国产精品美女久久久久aⅴ国产馆 | 色黄视频在线 | 精品不卡 | 久久久妇女国产精品影视 | 中文字幕视频三区 | 国产精品一区二区av | 91大神在线资源观看无广告 | 中文字幕欧美一区 |