美文网首页SpringBoot + Vue后台维护系统
SpringBoot + Vue 后台管理系统(三):Kaptc

SpringBoot + Vue 后台管理系统(三):Kaptc

作者: Bertram_Wang | 来源:发表于2019-05-14 23:36 被阅读48次

    验证码作用

    • 防止广告机注册等操作
    • 防止暴力破解

    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;
        } 
    }
    

    配置参数:

    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";
        // 干扰实现类
        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";
        // 背景实现类
        public final static String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";
        // 文本实现类
        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";
        // 背景实现类
        public final static String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";
        // 背景颜色渐变,开始颜色
        public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";
        // 背景颜色渐变,结束颜色
        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">系统登录</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使用细节-菜单角色等维护。

    相关文章

      网友评论

        本文标题:SpringBoot + Vue 后台管理系统(三):Kaptc

        本文链接:https://www.haomeiwen.com/subject/bdkyaqtx.html