SpringBoot + Vue 后臺管理系統(tǒng)(三):Kaptcha驗證碼

驗證碼作用

  • 防止廣告機(jī)注冊等操作
  • 防止暴力破解

Kaptcha驗證碼

  • 引入第三方庫
<!--kaptcha 驗證碼 -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>
  • 配置文件
/**
 * @Author Bertram.wang
 * @Date 2019年5月12日 下午10:48:58
 * @sign KaptchaConfig.java
 */
@Configuration
public class KaptchaConfig {
    @Bean
    public DefaultKaptcha defaultKaptcha() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 字體
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋體,楷體,微軟雅黑");
        properties.setProperty(Constants.KAPTCHA_BORDER, "no");
        
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    } 
}

配置參數(shù):

package com.google.code.kaptcha;

public class Constants
{
    
    public final static String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";

    public final static String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";

    public final static String KAPTCHA_SESSION_CONFIG_KEY = "kaptcha.session.key";

    public final static String KAPTCHA_SESSION_CONFIG_DATE = "kaptcha.session.date";
    // 圖片邊框,合法值:yes , no
    public final static String KAPTCHA_BORDER = "kaptcha.border";
    // 邊框顏色,合法值: rgb (and optional alpha) 或者 white,black,blue.
    public final static String KAPTCHA_BORDER_COLOR = "kaptcha.border.color";
    // 邊框厚度,合法值:>0
    public final static String KAPTCHA_BORDER_THICKNESS = "kaptcha.border.thickness";
    // 干擾顏色,合法值: r,g,b 或者 white,black,blue.
    public final static String KAPTCHA_NOISE_COLOR = "kaptcha.noise.color";
    // 干擾實現(xiàn)類
    public final static String KAPTCHA_NOISE_IMPL = "kaptcha.noise.impl";
    // 圖片樣式:
    // 水紋com.google.code.kaptcha.impl.WaterRipple
    // 魚眼com.google.code.kaptcha.impl.FishEyeGimpy
    // 陰影com.google.code.kaptcha.impl.ShadowGimpy
    public final static String KAPTCHA_OBSCURIFICATOR_IMPL = "kaptcha.obscurificator.impl";
    // 背景實現(xiàn)類
    public final static String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";
    // 文本實現(xiàn)類
    public final static String KAPTCHA_TEXTPRODUCER_IMPL = "kaptcha.textproducer.impl";
    // 文本集合,驗證碼值從此集合中獲取
    public final static String KAPTCHA_TEXTPRODUCER_CHAR_STRING = "kaptcha.textproducer.char.string";
    // 驗證碼長度
    public final static String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length";
    // 字體
    public final static String KAPTCHA_TEXTPRODUCER_FONT_NAMES = "kaptcha.textproducer.font.names";
    // 字體顏色,合法值: r,g,b  或者 white,black,blue.
    public final static String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color";
    // 字體大小
    public final static String KAPTCHA_TEXTPRODUCER_FONT_SIZE = "kaptcha.textproducer.font.size";
    // 文字間隔
    public final static String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space";
    // 文字渲染器    
    public final static String KAPTCHA_WORDRENDERER_IMPL = "kaptcha.word.impl";
    // 背景實現(xiàn)類
    public final static String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";
    // 背景顏色漸變,開始顏色
    public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";
    // 背景顏色漸變,結(jié)束顏色
    public static final String KAPTCHA_BACKGROUND_CLR_TO = "kaptcha.background.clear.to";
    // 圖片寬
    public static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width";
    // 圖片高
    public static final String KAPTCHA_IMAGE_HEIGHT = "kaptcha.image.height";
}
  • controller控制器
/**
 * @Author Bertram.wang
 * @Date 2019年5月12日 下午10:51:59
 * @sign KaptchaController.java
 */
@Controller
public class KaptchaController {
    @Autowired
    private DefaultKaptcha defaultKaptcha;
    @Autowired
    private RedisRepository redisRepository;
    /**
     * 驗證碼生成
     */
    @RequestMapping("/captcha.jpg")
    public void captcha(HttpServletResponse response) throws IOException {
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");

        // 生成文字驗證碼
        String text = defaultKaptcha.createText();
        // 生成圖片驗證碼
        BufferedImage image = defaultKaptcha.createImage(text);
        // 保存到shiro session
        redisRepository.set(RedisKey.kaptchaCode(text), text);

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

}
  • 登錄頁面Login.vue
    <template>
        <el-form :model="user" ref="loginForm" :rules="rules" class="login-container" label-position="left" label-width="0px" v-loading="loading">
            <h3 class="login_title">系統(tǒng)登錄</h3>
            <el-form-item prop="phone">
                <el-input type="text" v-model="user.name" auto-complete="off" placeholder="賬號"></el-input>
            </el-form-item>
            <el-form-item prop="password">
                <el-input type="password" v-model="user.password" auto-complete="off" placeholder="密碼"></el-input>
            </el-form-item>
            <el-form-item prop="kaptcha">
                <el-input type="text" v-model="user.kaptcha" auto-complete="off" placeholder="驗證碼"></el-input>
            </el-form-item>
            <el-form-item style="width: 100%" class="login_remember">
                   <!--驗證碼-->
                <el-image :src="kaptcha" @click="refreshCode" alt="加載失敗" >
                    <div slot="placeholder" class="image-slot">
                        <i class="el-icon-loading"></i>
                    </div>
                </el-image>
                <el-link class="rele_code" type="primary" @click="refreshCode">刷新</el-link>
                <el-button class="login_button" type="primary" @click="submitClick">登錄</el-button>
            </el-form-item>
        </el-form>
    </template>

    <script lang="ts">
        import { Component, Prop, Vue } from 'vue-property-decorator';
        import {User} from "@/entity/User"; 
        @Component({})
        export default class Login extends Vue {
            @Prop() private msg!: string;
            public user:User = new User("","","");
            rules:object = {
                name: [{required: true, message: '請輸入用戶名', trigger: 'blur'}],
                password: [{required: true, message: '請輸入密碼', trigger: 'blur'}],
                kaptcha: [{required: true, message: '請輸入驗證碼', trigger: 'blur'}],
            }
            loading:boolean = false;

            kaptcha: string = "http://localhost/vueweb/captcha.jpg?t=" + new Date().getTime();

            refreshCode(): void {
                this.kaptcha = "http://localhost/vueweb/captcha.jpg?t=" + new Date().getTime();
            }
        }
    </script>

驗證碼集成使用完成。
注: mybatis-plus使用細(xì)節(jié)-菜單角色等維護(hù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容