java图片验证码前后端分离

基于前后端分离或者非前后端分离都可以使用的java验证码实现方法
第一步:引入依赖

<dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
</dependency>

第二步:增加验证码生成的配置类,颜色,字体,干扰线等配置都在这里修改
参数参考地址:https://www.cnblogs.com/louis80/p/5230507.html

package com.aa.fs.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
/**
 * @author: songgt
 * @date: 2018-07-11 8:52
 */
@Configuration
public class KaptchaConfig {
    @Bean(name="captchaProducer")
    public DefaultKaptcha getKaptchaBean(){
        DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
        Properties properties=new Properties();
        properties.setProperty("kaptcha.border", "no");
        properties.setProperty("kaptcha.border.color", "white");
        properties.setProperty("kaptcha.textproducer.font.color", "255,192,55");
        properties.setProperty("kaptcha.image.width", "125");
        properties.setProperty("kaptcha.image.height", "45");
        properties.setProperty("kaptcha.session.key", "code");
        properties.setProperty("kaptcha.textproducer.font.size", "38");
        properties.setProperty("kaptcha.noise.color","21,113,171");
        properties.setProperty("kaptcha.background.clear.from","0,154,255");
        properties.setProperty("kaptcha.background.clear.to","0,202,255");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        properties.setProperty("kaptcha.textproducer.font.names", "Arial");
        Config config=new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

第三步:Service实现层

//记得在Service层需要注入
@Autowired
    private DefaultKaptcha defaultKaptcha;
// ----------------------------------------------------------------------
@Override
    public String createPicVerificationCode(String param,HttpServletRequest request) {
        if (StringUtils.isNotBlank(param)){
            byte[] captchaChallengeAsJpeg;
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            try {
                String verificationCodeText = defaultKaptcha.createText();
                //加入到session方便后面验证
                request.getSession().setAttribute(param,verificationCodeText);
                BufferedImage image = defaultKaptcha.createImage(verificationCodeText);
                ImageIO.write(image,"jpg",outputStream);
                captchaChallengeAsJpeg = outputStream.toByteArray();
                return Base64.getEncoder().encodeToString(captchaChallengeAsJpeg);
            }catch (Exception e){
                log.error("生成图片验证码异常"+e);
                e.printStackTrace();
            }finally {
                try {
                    outputStream.close();
                }catch (IOException e){
                    log.error("生成图片验证码结束,关闭ByteArrayOutputStream资源失败"+e);
                    e.printStackTrace();
                }
            }
        }
        return "验证码生成失败,请重试";
    }

第四步:controller层

@ApiOperation(value = "获取图片验证码",notes = "返回ResultDataDto", response = ResultDataDto.class)
    @PostMapping(path = "/getPictureCode",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResultDataDto getPictureCode(HttpServletRequest request){
        String param = "ImgVerificationCodeMark";
        String base64ImgStr = sysUserService.createPicVerificationCode(param,request);
        if (StringUtils.isNotBlank(base64ImgStr) && !base64ImgStr.equals(CREATE_VERIFICATION_CODE_ERROR)){
            return ResultDataDto.addOperationSuccess().setData(base64ImgStr);
        }else {
            return ResultDataDto.addOperationFailure(base64ImgStr);
        }
    }

第五步:访问测试
http://localhost:8080/getPictureCode返回一个base64编码的图片字符串

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

第六步:利用在线工具测试返回的base64编码的图片验证码字符串是否可以解析http://www.vgot.net/test/image2base64.php
解析结果如下:

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容