最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot實現(xiàn)登錄驗證碼功能的案例詳解

 更新時間:2022年08月10日 10:57:42   作者:不斷前進的皮卡丘  
驗證碼的作用可以有效防止其他人對某一個特定的注冊用戶用特定的程序暴力破解方式進行不斷的登錄嘗試,接下來通過本文給大家介紹Spring?Boot實現(xiàn)登錄驗證碼功能,需要的朋友可以參考下

驗證碼的作用

驗證碼的作用:可以有效防止其他人對某一個特定的注冊用戶用特定的程序暴力破解方式進行不斷的登錄嘗試
我們其實很經(jīng)??吹?,登錄一些網(wǎng)站其實是需要驗證碼的,比如???,QQ等。使用驗證碼是現(xiàn)在很多網(wǎng)站通行的一種方式,這個問題是由計算機生成并且評判的,但是必須只有人類才能解答,因為計算機無法解答驗證碼的問題,所以回答出問題的用戶就可以被認為是人類。
驗證碼一般用來防止批量注冊。

案例要求

驗證碼本質:后端程序隨機驗證碼
圖片的創(chuàng)建:
—java api手動創(chuàng)建圖片
—JavaScript 前端創(chuàng)建圖片
驗證碼的刷新
—添加JavaScript的點擊事件,重新請求驗證碼圖片

前端頁面準備

因為涉及到jQuery,所以需要在resources/static創(chuàng)建目錄,存放jQuery庫

在這里插入圖片描述

準備login.html頁面

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>用戶登錄</title>
    <!--引入jQuery -->
    <script type="text/javascript" src="/js/jquery-1.8.3.min.js"></script>
  </head>
  <body>
    <h2>用戶登錄</h2>
    <form action="/login" method="post">
      用戶名:<input type="text" name="username"><br><br>
      密碼  :<input type="password" name="password"><br><br>
      驗證碼:<input id="identify-input" type="text" name="identifyCode">
      <img id="identify-img" src="/identifyImage"><br><br>
      <input type="submit" value="登錄">
    </form>
    <!--綁定點擊事件 -->
    <script>
      $("#identify-img").on('click',function (){
        // 點擊驗證碼那個圖片的時候,我們輸入的驗證碼那個框就會清空
        $('#identify-input').val('')
        //而且我們點擊驗證碼的時候,希望它可以改變驗證碼內容,其實是通過發(fā)送新請求來改變驗證碼內容
        $('#identify-img').attr('src','/identifyImage?'+Math.random())
      })
      
    </script>
  </body>
</html>

隨機驗證碼工具類

public class IdentifyCodeUtils {
    //設置圖片寬
    private int width = 95;
    //設置圖片高度
    private int height = 25;
    //設置干擾線數(shù)量
    private int lineSize = 40;
    //隨機產(chǎn)生數(shù)字和字母組合的字符串
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    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);
    }
    
    /**
    * 獲取驗證碼
    *
    * @return
    */
    public String getIdentifyCode() {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            char c = randString.charAt(random.nextInt(randString.length()));
            buffer.append(c);
        }
        return buffer.toString();
    }
    
    /**
    * 生成隨機圖片
    *
    * @param identifyCode
    * @return
    */
    public BufferedImage getIdentifyImage(String identifyCode) {
        //BufferedImage類是具有緩沖區(qū)的Image類,Image類是用來描述圖像信息的類
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        //產(chǎn)生Image對象的Graphics對象,改對象可以在圖像上進行各種繪制操作
        Graphics graphics = image.getGraphics();
        //圖片大小
        graphics.fillRect(0, 0, width, height);
        //字體大小
        graphics.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
        //字體顏色
        graphics.setColor(getRandColor(110, 133));
        //繪制干擾線
        for (int i = 0; i <= lineSize; i++) {
            drawLine(graphics);
        }
        //繪制隨機字符
        drawString(graphics, identifyCode);
        graphics.dispose();
        return image;
        
    }
    
    /**
    * 繪制字符串
    */
    private void drawString(Graphics g, String identifyCode) {
        for (int i = 0; i < identifyCode.length(); i++) {
            g.setFont(getFont());
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                                 .nextInt(121)));
            g.translate(random.nextInt(3), random.nextInt(3));
            g.drawString(String.valueOf(identifyCode.charAt(i)), 13 * i + 20, 18);
        }
        
        
    }
    
    /**
    * 響應驗證碼圖片
    *
    * @param identifyImg
    * @param response
    */
    public void responseIdentifyImg(BufferedImage identifyImg, HttpServletResponse response) {
        //設置響應類型,告訴瀏覽器輸出的內容是圖片
        response.setContentType("image/jpeg");
        //設置響應頭信息,告訴瀏覽器不用緩沖此內容
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expire", 0);
        try {
            //把內存中的圖片通過流動形式輸出到客戶端
            ImageIO.write(identifyImg, "JPEG", response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
    * 繪制干擾線
    */
    private void drawLine(Graphics graphics) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        graphics.drawLine(x, y, x + xl, y + yl);
    }
}

后端控制器

@Controller
public class UserController {
    @RequestMapping("/loginShow")
    public String loginShow(){
        return "login.html";
    }
    @PostMapping("/login")
    public String login(String username,String password,String identifyCode,HttpSession session){
        System.out.println("用戶名:"+username);
        System.out.println("密碼:"+password);
        System.out.println("驗證碼:"+identifyCode);
        //從session中取出驗證碼
        String sessionCode = (String)session.getAttribute("identifyFyCode");
        if (identifyCode.equalsIgnoreCase(sessionCode)){
            System.out.println("驗證碼正確");
            //進行登錄判斷的邏輯大家自己寫,這里就不演示了
        }else{
            System.out.println("驗證碼錯誤");
            //重定向到登錄畫面
            return "redirect:/loginShow";
        }
         return "";
    }

    /**
     * 給前端返回一個驗證碼圖片
     * @return
     */
    @RequestMapping("/identifyImage")
    public void identifyImage(HttpServletResponse response, HttpSession session){
        //創(chuàng)建隨機驗證碼
        IdentifyCodeUtils utils = new IdentifyCodeUtils();
        String identifyCode = utils.getIdentifyCode();
        //session存入驗證碼
        session.setAttribute("identifyCode", identifyCode);
        //根據(jù)驗證碼創(chuàng)建圖片
        BufferedImage identifyImage = utils.getIdentifyImage(identifyCode);
        //回傳給前端
        utils.responseIdentifyImg(identifyImage,response);

    }
}

測試

在這里插入圖片描述

當我們點擊驗證碼這個圖片的時候,它就會生成新驗證碼
并且如果我們在輸入框中如果有寫驗證碼的話,當我們點擊驗證碼圖片,它就會把輸入框內容清空(大家自己測試)

到此這篇關于Spring Boot實現(xiàn)登錄驗證碼功能的案例詳解的文章就介紹到這了,更多相關springboot登錄驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java之常用類小結案例講解

    Java之常用類小結案例講解

    這篇文章主要介紹了Java之常用類小結案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • JAVA多線程和并發(fā)基礎面試問答(翻譯)

    JAVA多線程和并發(fā)基礎面試問答(翻譯)

    多線程和并發(fā)問題是Java技術面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應該牢固的掌握Java多線程基礎知識來對應日后碰到的問題
    2014-09-09
  • Java?int類型如何獲取高低位

    Java?int類型如何獲取高低位

    這篇文章主要介紹了Java?int類型如何獲取高低位,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 一文了解Java動態(tài)代理的原理及實現(xiàn)

    一文了解Java動態(tài)代理的原理及實現(xiàn)

    動態(tài)代理指的是,代理類和目標類的關系在程序運行的時候確定的,客戶通過代理類來調用目標對象的方法,是在程序運行時根據(jù)需要動態(tài)的創(chuàng)建目標類的代理對象。本文將通過案例詳細講解一下Java動態(tài)代理的原理及實現(xiàn),需要的可以參考一下
    2022-07-07
  • JDK源碼之線程并發(fā)協(xié)調神器CountDownLatch和CyclicBarrier詳解

    JDK源碼之線程并發(fā)協(xié)調神器CountDownLatch和CyclicBarrier詳解

    我一直認為程序是對于現(xiàn)實世界的邏輯描述,而在現(xiàn)實世界中很多事情都需要各方協(xié)調合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產(chǎn)品以及項目經(jīng)理等不同角色人員進行通力合作才能完成最終的交付
    2022-02-02
  • springboot整合shiro之thymeleaf使用shiro標簽的方法

    springboot整合shiro之thymeleaf使用shiro標簽的方法

    Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP ,這篇文章主要介紹了springboot整合shiro之thymeleaf使用shiro標簽的相關知識,需要的朋友可以參考下
    2021-10-10
  • 為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    這篇文章主要介紹了為什么程序中突然多了 200 個 Dubbo-thread 線程的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java實現(xiàn)替換Word中文本和圖片功能

    Java實現(xiàn)替換Word中文本和圖片功能

    Word中的替換功能以查找指定文本然后替換為新的文本,可單個替換或全部替換。本文將用Java語言實現(xiàn)Word中的文本、圖片替換功能,需要的可以參考一下
    2022-06-06
  • java網(wǎng)絡編程學習java聊天程序代碼分享

    java網(wǎng)絡編程學習java聊天程序代碼分享

    java聊天程序代碼分享,大家參考使用吧
    2013-12-12
  • springboot使用線程池(ThreadPoolTaskExecutor)示例

    springboot使用線程池(ThreadPoolTaskExecutor)示例

    大家好,本篇文章主要講的是springboot使用線程池(ThreadPoolTaskExecutor)示例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

赣榆县| 民乐县| 从化市| 自治县| 农安县| 隆回县| 泾源县| 白沙| 孟州市| 南阳市| 双峰县| 故城县| 页游| 普兰县| 镇远县| 遵义市| 旬邑县| 天峨县| 柳州市| 唐河县| 灌云县| 敦煌市| 都江堰市| 昭通市| 连平县| 湖南省| 饶阳县| 海口市| 繁峙县| 屯昌县| 安图县| 三原县| 封丘县| 周至县| 青浦区| 图片| 罗田县| 平陆县| 来凤县| 轮台县| 云阳县|