国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼

這篇具有很好參考價值的文章主要介紹了SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

圖形驗證碼是用于驗證用戶身份的一種方式,通常在網(wǎng)站注冊、登錄或進行某些敏感操作時會使用。它通過展示一個包含隨機字符或數(shù)字的圖形,要求用戶輸入相應(yīng)的字符或數(shù)字來證明其為真人而非機器人。圖形驗證碼能有效地防止機器人攻擊和惡意注冊行為,提高網(wǎng)站的安全性。

本文將基于 SpringBoot 和原生的 Java awt 包,完成圖形驗證碼的實現(xiàn),源碼在 項目倉庫 中,需要者可自助參考。

一、導(dǎo)入依賴

在實現(xiàn)圖形驗證碼之前,首先要導(dǎo)入依賴,比如 SpringBoot 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

awt 包屬于 Java 原生包,無需導(dǎo)入三方 maven 依賴,只需引入 JDK 即可。

二、編寫工具類

接下來,就開始開發(fā)驗證碼的工具類,包括驗證碼配置、生成隨機數(shù)、生成隨機顏色、編寫創(chuàng)建圖片方法、編寫構(gòu)建函數(shù),下面將逐一介紹。

2.1 驗證碼配置

首先是驗證碼的配置,創(chuàng)建 CreateVerifyCode 類,創(chuàng)建相應(yīng)字段,包括字符個數(shù)、圖片高度、圖片寬度、干擾個數(shù)等參數(shù),定義如下。

@ApiModelProperty(value = "驗證碼字符個數(shù)")
private int charactersNumber = 4;

@ApiModelProperty(value = "圖片高度")
private int imagePeripheralHeight = 40;

@ApiModelProperty(value = "圖片寬度")
private int imagePeripheralWidth = 160;

@ApiModelProperty(value = "干擾線數(shù)")
private int lineCount = 20;

2.2 生成隨機數(shù)

新建一個方法 randomStr,用于實現(xiàn)生成隨機數(shù)的功能,代碼如下。

@ApiOperation(value = "隨機生成驗證碼")
public String randomStr(int size) {
    String str1 = "0123456789";
    String str2 = "";
    for (int i = 0; i < size; i++) {
        double randomIndex = Math.random();
        double randomNumber = randomIndex * (str1.length() - 1);
        str2 += str1.charAt((int) randomNumber);
    }
    return str2;
}

2.3 生成隨機顏色

新建一個方法 getRandColor,用于實現(xiàn)生成隨機顏色的功能,代碼如下。

@ApiOperation(value = "隨機生成驗證碼顏色")
private Color getRandColor(int color1, int color2) {
    color1 = color1 > 255 ? 255 : color1;
    color2 = color2 > 255 ? 255 : color2;
    return new Color(color1 + random.nextInt(color2 - color1), color1 + random.nextInt(color2 - color1), color1 + random.nextInt(color2 - color1));
}

2.4 編寫創(chuàng)建圖片方法

有了驗證碼配置之后,新建一個方法 creatImage,用于實現(xiàn)圖形驗證碼圖片創(chuàng)建的邏輯,代碼如下。

@ApiOperation(value = "圖片生成工具類")
private void creatImage(String code) {
    if(ZwzNullUtils.isNull(code)){
        throw new ZwzException("圖形驗證碼過期了,再生成個新的哦!");
    }
    this.code = code;
    buffImg = new BufferedImage(imagePeripheralWidth, imagePeripheralHeight, BufferedImage.TYPE_INT_RGB);
    Graphics g = buffImg.getGraphics();
    g.setColor(getRandColor(200, 250));
    g.fillRect(0, 0, imagePeripheralWidth, imagePeripheralHeight);
    Font font = new Font("Fixedsys", Font.BOLD, imagePeripheralHeight - 5);
    g.setFont(font);
    float yawpRate = 0.01f;
    int area = (int) (yawpRate * imagePeripheralWidth * imagePeripheralHeight);
    for (int i = 0; i < area; i++) {
        buffImg.setRGB(random.nextInt(imagePeripheralWidth), random.nextInt(imagePeripheralHeight), random.nextInt(255));
    }
    for (int i = 0; i < lineCount; i++) {
        int xs = random.nextInt(imagePeripheralWidth);
        int ys = random.nextInt(imagePeripheralHeight);
        int xe = xs + random.nextInt(imagePeripheralWidth);
        int ye = ys + random.nextInt(imagePeripheralHeight);
        g.setColor(getRandColor(2, 254));
        g.drawLine(xs, ys, xe, ye);
    }
    for (int i = 0; i < code.length(); i++) {
        String strRand = code.substring(i, i + 1);
        g.setColor(getRandColor(2, 254));
        g.drawString(strRand, i * (imagePeripheralWidth / charactersNumber) + 3, imagePeripheralHeight - 8);
    }
}

2.5 編寫構(gòu)建函數(shù)

為了用盡可能精簡的代碼實現(xiàn)圖形驗證碼,構(gòu)造函數(shù)是比不可少的,開發(fā)者可以在構(gòu)建對象時直接傳入?yún)?shù),實現(xiàn)圖形驗證碼的設(shè)計,代碼如下。

public CreateVerifyCode(int imageWidth, int imageHeight, int codeCount, int lineCount, String code) {
    this.imagePeripheralWidth = imageWidth;
    this.imagePeripheralHeight = imageHeight;
    this.charactersNumber = codeCount;
    this.lineCount = lineCount;
    creatImage(code);
}

三、編寫接口

工具類編寫完成后,就開始設(shè)計 API 接口了,可以分為驗證碼初始化和圖片返回。

3.1 驗證碼初始化

首先定義一個 init 接口,用戶請求該接口時,系統(tǒng)利用 Java 的 UUID,生成一個隨機字符串,并隨機生成一個四位數(shù)字,放入緩存,返回該隨機字符串,代碼如下。

@RequestMapping(value = "/init", method = RequestMethod.GET)
@ApiOperation(value = "初始化驗證碼")
public Result<Object> init() {
    String codeId = UUID.randomUUID().toString().replace("-","");
    redisTemplate.opsForValue().set(codeId, new CreateVerifyCode().randomStr(4),2L, TimeUnit.MINUTES);
    return ResultUtil.data(codeId);
}

接口測試結(jié)果如下,接口返回了一個隨機字符串bdb3cc192cf147eda20afa5e5d22bd8c。

SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼

3.2 圖片返回

前端收到隨機字符串 bdb3cc192cf147eda20afa5e5d22bd8c 后,再次請求,拿走驗證碼圖片,核心代碼如下。

@RequestMapping(value = "/draw/{captchaId}", method = RequestMethod.GET)
@ApiOperation(value = "根據(jù)驗證碼ID獲取圖片")
public void draw(@PathVariable("captchaId") String captchaId, HttpServletResponse response) throws IOException {
    String codeStr = redisTemplate.opsForValue().get(captchaId);
    CreateVerifyCode createVerifyCode = new CreateVerifyCode(116,36,4,10, codeStr);
    response.setContentType("image/png");
    createVerifyCode.write(response.getOutputStream());
}

首先根據(jù)隨機字符串,在 redis 中拿到驗證碼的值,在調(diào)用驗證碼工具類生成圖片,返回前端。

SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼

SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼

SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼

3.3 驗證碼過濾

系統(tǒng)集成了 Spring Security,需要引入并重寫 WebSecurityConfig 類,重寫 securityFilterChain 方法。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

    http.authorizeHttpRequests().requestMatchers("/zwz/dictData/getByType/**","/zwz/file/view/**","/zwz/user/regist","/zwz/common/**","/*/*.js","/*/*.css","/*/*.png","/*/*.ico", "/swagger-ui.html").permitAll()
            .and().formLogin().loginPage("/zwz/common/needLogin").loginProcessingUrl("/zwz/login").permitAll()
            .successHandler(authenticationSuccessHandler).failureHandler(authenticationFailHandler).and()
            .headers().frameOptions().disable().and()
            .logout()
            .permitAll()
            .and()
            .authorizeHttpRequests()
            .anyRequest()
            .authenticated()
            .and()
            .cors().and()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .exceptionHandling().accessDeniedHandler(zwzAccessDeniedHandler)
            .and()
            .authenticationProvider(authenticationProvider())
            .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
            .addFilterBefore(imageValidateFilter, UsernamePasswordAuthenticationFilter.class);
    return http.build();
}

對于通過驗證碼的請求,給與放行,核心代碼如下:

@Override
@ApiOperation(value = "驗證碼過濾")
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    Boolean filterFlag = false;
    for(String requestURI : captchaProperties.getVerification()){
        if(pathMatcher.match(requestURI, request.getRequestURI())){
            filterFlag = true;
            break;
        }
    }
    if(!filterFlag) {
        filterChain.doFilter(request, response);
        return;
    }
    String verificationCodeId = request.getParameter("captchaId");
    String userInputCode = request.getParameter("code");
    if(ZwzNullUtils.isNull(userInputCode) || ZwzNullUtils.isNull(verificationCodeId)){
        ResponseUtil.out(response, ResponseUtil.resultMap(RESPONSE_FAIL_FLAG,RESPONSE_CODE_FAIL_CODE,"驗證碼為空"));
        return;
    }
    String codeAnsInRedis = redisTemplate.opsForValue().get(verificationCodeId);
    if(ZwzNullUtils.isNull(codeAnsInRedis)){
        ResponseUtil.out(response, ResponseUtil.resultMap(RESPONSE_FAIL_FLAG,RESPONSE_CODE_FAIL_CODE,"已過期的驗證碼,需要重新填寫"));
        return;
    }
    if(!Objects.equals(codeAnsInRedis.toLowerCase(),userInputCode.toLowerCase())) {
        ResponseUtil.out(response, ResponseUtil.resultMap(RESPONSE_FAIL_FLAG,RESPONSE_CODE_FAIL_CODE,"驗證碼不正確"));
        return;
    }
    redisTemplate.delete(verificationCodeId);
    filterChain.doFilter(request, response);
}

最終,基于 SpringBoot+原生 awt,實現(xiàn)花花綠綠的圖形驗證碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-472057.html

到了這里,關(guān)于SpringBoot+原生awt,實現(xiàn)花花綠綠的圖形驗證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 前后端分離java開發(fā)圖形驗證碼+谷歌開源Kaptcha使用(Springboot+redis實現(xiàn)圖形驗證碼校驗)

    前后端分離java開發(fā)圖形驗證碼+谷歌開源Kaptcha使用(Springboot+redis實現(xiàn)圖形驗證碼校驗)

    注冊 - 登錄 - 修改密碼 一般需要發(fā)送驗證碼,但是容易被攻擊惡意調(diào)用。 手機短信轟炸機是批量、循環(huán)給手機無限發(fā)送各種網(wǎng)站的注冊驗證碼短信的方法。 短信一條5分錢,如果被大盜刷大家自己計算郵箱通知不用錢,但被大盜刷,帶寬、連接等都被占用,導(dǎo)致無法正常使用

    2024年01月19日
    瀏覽(22)
  • Java實現(xiàn)的五子棋游戲 ~java.awt&java.swing

    Java實現(xiàn)的五子棋游戲 ~java.awt&java.swing

    作業(yè)要求: (1)課題代號: 2 (2)課題名稱: 2D 游戲設(shè)計 (3)課題要求:設(shè)計一種二維游戲(如數(shù)獨,掃雷,飛機大戰(zhàn),貪食蛇,五子棋等),完成界面設(shè)計和必要的游戲功能 以下主要實現(xiàn)的功能有: 一、下棋功能,在棋盤的交點處落子。 二、簡單人機對戰(zhàn)功能。 1.實現(xiàn)

    2024年02月09日
    瀏覽(22)
  • unity 3d 場景變白了,模型發(fā)白,白花花一片,場景曝光了

    unity 3d 場景變白了,模型發(fā)白,白花花一片,場景曝光了

    前面做了unity的三維場景,最近切換了unity for Intel和apple silicon的不同版本,發(fā)現(xiàn)我的場景變成了白花花的一片,超級曝光,運行程序也是一片的白,我的天呀。。。。 背景: 1,,unity 2021.3.5 for mac m1(apple silicon)非Intel 2,烘焙了燈光貼圖。 疑似問題: 1,場景燈光;2,場景顯示

    2024年02月11日
    瀏覽(23)
  • 【云原生】k8s圖形化管理工具之rancher

    【云原生】k8s圖形化管理工具之rancher

    rancher是一個開源的企業(yè)級多集群的k8s管理平臺。 rancher和k8s區(qū)別: 都是為了容器的調(diào)度和編排系統(tǒng),但是rancher不僅能夠調(diào)度,還能管理k8s集群,自帶監(jiān)控(普羅米修斯),大公司都是圖形化。 rancher自帶監(jiān)控(普羅米修斯) master01?192.168.10.10 node01 192.168.10.20 node02?192.168.10.30 node04

    2024年01月25日
    瀏覽(27)
  • 【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驅(qū)動架構(gòu)(MDA)解析,實現(xiàn)異步處理與解耦合!

    【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驅(qū)動架構(gòu)(MDA)解析,實現(xiàn)異步處理與解耦合!

    ???? 歡迎光臨,終于等到你啦 ???? ??我是 蘇澤 ,一位對技術(shù)充滿熱情的探索者和分享者。???? ??持續(xù)更新的專欄 《Spring 狂野之旅:從入門到入魔》 ?? 本專欄帶你從Spring入門到入魔 ? 這是蘇澤的個人主頁可以看到我其他的內(nèi)容哦???? 努力的蘇澤 http://suzee.blog.

    2024年03月10日
    瀏覽(28)
  • 【K8S 云原生】K8S的圖形化工具——Rancher

    【K8S 云原生】K8S的圖形化工具——Rancher

    目錄 一、rancher概述 1、rancher概念 2、rancher和K8S的區(qū)別: 二、實驗 1、安裝部署 2、給集群添加監(jiān)控: 3、創(chuàng)建命名空間: 4、創(chuàng)建deployment: 5、創(chuàng)建service: 6、創(chuàng)建ingress: 7、創(chuàng)建hpa 8、創(chuàng)建PVC 1、rancher概念 rancher實用一個開源的企業(yè)級多集群的K8S管理平臺 2、rancher和K8S的區(qū)別

    2024年01月25日
    瀏覽(52)
  • 【W(wǎng)SL2】【圖形界面】【CUDA驅(qū)動】WSL2 Ubuntu+gnome原生圖形界面及WSL2顯卡CUDA驅(qū)動的安裝

    【W(wǎng)SL2】【圖形界面】【CUDA驅(qū)動】WSL2 Ubuntu+gnome原生圖形界面及WSL2顯卡CUDA驅(qū)動的安裝

    ??沒有圖形化界面的Ubuntu實在是看著不爽,雖然已經(jīng)習(xí)慣用命令。為了更加方便使用WSL2子系統(tǒng),還是配置了gnome原生桌面(雖然不是很輕量級,但是舒服?。。?,然后因為有深度學(xué)習(xí)需求,有NVIDIA的顯卡順帶配置了一下顯卡驅(qū)動。 ??下面看看如何配置WSL2圖形界面和顯卡

    2024年02月10日
    瀏覽(24)
  • ImageIO的應(yīng)用 (AWT和Swing初接觸)

    ImageIO的應(yīng)用 (AWT和Swing初接觸)

    在講imageio之前,我們先來復(fù)習(xí)一下IO流的使用。 這里我建立一個Java類,用來實現(xiàn)讀取文檔中的內(nèi)容,并且能夠識別換行,話不多說,上代碼: 代碼是不是簡潔易懂?有手就行。 注意一下,這里的文檔需要建立在 F:Java_PrjJava_Project 包下 這里貼張圖,展示一下文檔內(nèi)容 然后

    2024年02月08日
    瀏覽(29)
  • java.awt.FontFormatException: java.nio.BufferUnderflowException

    使用如上語句創(chuàng)建字體時出現(xiàn)問題。 java.awt.FontFormatException: java.nio.BufferUnderflowException 異常表明在處理字體數(shù)據(jù)時出現(xiàn)了緩沖區(qū)下溢(Buffer Underflow)的情況。這通常發(fā)生在嘗試讀取字體數(shù)據(jù)時,緩沖區(qū)的容量比所需數(shù)據(jù)少,導(dǎo)致無法從緩沖區(qū)中讀取足夠的字節(jié)??赡軉栴}如下

    2024年04月09日
    瀏覽(27)
  • 【了解Java GUI編程】AWT和Swing的基本用法

    【了解Java GUI編程】AWT和Swing的基本用法

    GUI :Graphical User Interface, 圖形用戶界面,指在 計算機 出現(xiàn)后,在屏幕上使用 圖形界面 來幫助 用戶(User) 與機器(Machine)打交道用的 界面接口(Interface)。 簡單地理解,就是電腦打開的各個界面及彈窗,用戶可進行鼠標、鍵盤等操作。 目錄 一、AWT 1.1 組件和容器 1.1.1 AWT常用組

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包