1. 程式人生 > 其它 >圖形驗證碼工具easy-captcha

圖形驗證碼工具easy-captcha


支援gif、中文、算術等型別,可用於Java Web、JavaSE等專案


匯入依賴:

        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>

或者

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>kaptcha-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>



前端:

  • ?d='+new Date()*1不影響連結,它唯一的作用是向IE表明: 圖片連結發生了變化,圖片需要重新整理
<img alt="單擊圖片重新整理!" class="pointer" th:src="@{/common/kaptcha}"
                             onclick="this.src='/common/kaptcha?d='+new Date()*1">
                        <!--.-->

生成圖片的controller:

@GetMapping("/common/kaptcha")
    public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/png");

        // 三個引數分別為寬、高、位數
        SpecCaptcha captcha = new SpecCaptcha(150, 40, 4);

        // 設定型別 數字和字母混合
        captcha.setCharType(Captcha.TYPE_DEFAULT);

        //設定字型
        captcha.setCharType(Captcha.FONT_9);

        // 驗證碼存入session
        httpServletRequest.getSession().setAttribute("verifyCode", captcha.text().toLowerCase());

        // 輸出圖片流
        captcha.out(httpServletResponse.getOutputStream());
    }

登入判斷的controller:

@PostMapping(value = "/login")
    public String login(@RequestParam("userName") String userName,
                        @RequestParam("password") String password,
                        @RequestParam("verifyCode") String verifyCode,
                        HttpSession session,
                        HttpServletRequest request) {
        //獲得驗證碼,注意與上面的verifyCode區分:上面那個是 使用者輸入的驗證碼,session中的"verifyCode"的是圖片上生成的驗證碼
        String kaptchaCode = session.getAttribute("verifyCode")+"";

        //進行判斷:保證使用者輸入的不為空
        if(!StringUtils.hasLength(verifyCode)){
            session.setAttribute("errorMsg","驗證不能為空!");
            return "admin/login";
        }
        //hasLength判斷是否為空:為空則false
        //先判斷左邊:當圖片上的驗證碼為空時,則左邊!false=true,此時if(true),不會對右邊進行判斷了;當圖片上的驗證碼不為空時,左邊表示式為 !true=false 。
        //當左邊表示式為空時,會接著判斷右邊的值:使用者輸入的驗證碼和圖片上的相同,則右邊為!true=false,則if(false)不進行if裡面的語句
        //當用戶輸入的驗證碼和圖片上的不相同,則右邊為!false=true,則if(false || true)=if(true),因此提示驗證碼錯誤
        if (!StringUtils.hasLength(kaptchaCode) || !verifyCode.toLowerCase().equals(kaptchaCode)){
            session.setAttribute("errorMsg","驗證碼錯誤!");
            return "admin/login";
        }

        String getAdminPsw = MD5Util.MD5Encode(password,"UTF-8");
        AdminUser login = adminUserService.login(userName, getAdminPsw);
        if (login == null){
            session.setAttribute("errorMsg","使用者名稱或者密碼錯誤!");
            return "admin/login";
        }
        session.setAttribute("admin",login);
        session.setAttribute("loginUser", login.getNickName());
        session.setAttribute("loginUserId", login.getAdminUserId());
        return "admin/index";
    }


參考連結:

https://www.jianshu.com/p/8a853a13159b

https://blog.csdn.net/qq_43619628/article/details/112383930