日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

登录验证码实现(Captcha)

發布時間:2024/8/26 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 登录验证码实现(Captcha) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

登錄驗證碼

登錄驗證是一般系統都會有的功能,驗證的方式也多種多樣,比如輸入式驗證碼,拖動式驗證條,拖動式驗證拼圖等等。

我們這里先實現常規的輸入驗證碼的方式,右邊顯示驗證碼圖片,點擊可刷新,左邊輸入驗證碼。如下圖為實現的效果。

實現案例

驗證碼的實現需要前后端協同,脫離彼此則不可用,故將前后端的實現放在一起,不再另寫前端教程。

后端實現

1.添加依賴

打開kitty-admin 工程,添加maven依賴。

pom.xml

<!-- kaptcha -->
<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>${kaptcha.version}</version>
</dependency>

版本是<kaptcha.version>0.0.9</kaptcha.version>

2.添加配置

添加驗證碼配置類KaptchaConfig,配置驗證碼的一些樣式。

KaptchaConfig.java

package com.louis.kitty.admin.config;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;

/**
 * 驗證碼配置
 * @author Louis
 * @date Oct 29, 2018
 */
@Configuration
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha producer() {
        Properties properties = new Properties();
        properties.put("kaptcha.border", "no");
        properties.put("kaptcha.textproducer.font.color", "black");
        properties.put("kaptcha.textproducer.char.space", "5");
        Config config = new Config(properties);
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

3.添加驗證碼獲取接口

添加驗證碼獲取接口,并將生成的驗證碼保存起來,在登錄的時候用來跟前臺輸入驗證碼進行匹配。

SysLoginController.java

    @GetMapping("captcha.jpg")
    public void captcha(HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");

        // 生成文字驗證碼
        String text = producer.createText();
        // 生成圖片驗證碼
        BufferedImage image = producer.createImage(text);
        // 保存到驗證碼到 session
        ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);

        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpg", out);    
        IOUtils.closeQuietly(out);
    }

4.登錄接口增加驗證碼驗證

登錄接口增加驗證碼驗證,將之前保存的驗證碼跟前臺輸入驗證碼進行匹配。

SysLoginController.java

    /**
     * 登錄接口
     */
    @PostMapping(value = "/login")
    public HttpResult login(@RequestBody LoginBean loginBean) throws IOException {
        String userName = loginBean.getAccount();
        String password = loginBean.getPassword();
        String captcha = loginBean.getCaptcha();
        
        // 從session中獲取之前保存的驗證碼跟前臺傳來的驗證碼進行匹配
        Object kaptcha = ShiroUtils.getSessionAttribute(Constants.KAPTCHA_SESSION_KEY);
        if(kaptcha == null){
            return HttpResult.error("驗證碼已失效");
        }
        if(!captcha.equals(kaptcha)){
            return HttpResult.error("驗證碼不正確");
        }
        
        // 用戶信息
        SysUser user = sysUserService.findByName(userName);

        // 賬號不存在、密碼錯誤
        if (user == null) {
            return HttpResult.error("賬號不存在");
        }
        
        if (!match(user, password)) {
            return HttpResult.error("密碼不正確");
        }

        // 賬號鎖定
        if (user.getStatus() == 0) {
            return HttpResult.error("賬號已被鎖定,請聯系管理員");
        }

        // 生成token,并保存到數據庫
        SysUserToken data = sysUserTokenService.createToken(user.getId());
        return HttpResult.ok(data);
    }

5.修改Shiro配置

修改Shiro配置,配置驗證碼生成接口無需進行登錄認證。

ShiroConfig.java

到這里后臺代碼就完成了。

啟動程序,訪問http://localhost:8001/captcha.jpg,如果結果如下就沒問題了。

前端實現

1.添加組件

打開登錄頁面,在密碼欄下面增加一行驗證碼。

Login.vue

<el-form-item >
  <el-col :span="12">
    <el-form-item prop="captcha">
      <el-input type="test" v-model="loginForm.captcha" auto-complete="off" placeholder="驗證碼, 單擊圖片刷新"
       >
      </el-input>
    </el-form-item>
  </el-col>
  <el-col class="line" :span="1">&nbsp;</el-col>
  <el-col :span="11">
    <el-form-item>
        <img class="pointer" :src="loginForm.src" @click="refreshCaptcha">
    </el-form-item>
  </el-col>
</el-form-item>

2.添加組件

添加驗證碼相關的屬性,captcha是驗證碼值,src是驗證碼圖片路徑。

Login.vue

3.驗證規則

添加驗證碼驗證規則。

Login.vue

4.傳入驗證碼

在登錄接口調用的時候,一并傳入驗證碼。

Login.vue

let userInfo = {account:this.loginForm.account, password:this.loginForm.password, captcha:this.loginForm.captcha}

5.刷新驗證碼

添加refreshCaptcha方法,增加刷新驗證碼的邏輯。

Login.vue

refreshCaptcha: function(){
      this.loginForm.src = this.global.baseUrl + "/captcha.jpg?t=" + new Date().getTime();
    }

到這里前端diam也完成了。

最終效果

啟動前后端,最終界面效果如下。

總結

以上是生活随笔為你收集整理的登录验证码实现(Captcha)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。