Java语言学习——基于Java实现随机字母数字验证码
小职 2020-10-10 来源 : 阅读 649 评论 0

摘要:本篇介绍了Java语言学习——基于Java实现随机字母数字验证码,希望大家对Java的学习有更深入的理解。

本篇介绍了Java语言学习——基于Java实现随机字母数字验证码,希望大家对Java的学习有更深入的理解。

Java语言学习——基于Java实现随机字母数字验证码

生成随机验证码

VerifyCode 工具类

 

package com.meeno.common.cerifycode;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Random;

/**

 * @description: 随机验证码

 * @author: Wzq

 * @create: 2020-09-08 16:55

 */

public class VerifyCode {

    private int w=70;

    private int h=35;

    private Random r= new Random();

    private String[] fontNames={"宋体","华文楷体","黑体","微软雅黑","楷体_GB2312"};

    private String codes="012345678901234567890123456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";

    private Color bgColor = new Color(255,255,255);

    private String text;

    private Color randomColor(){

        int red = r.nextInt(150);

        int green = r.nextInt(150);

        int blue = r.nextInt(150);

        return new Color(red,green,blue);

    }    private Font randomFont(){

        int index = this.r.nextInt(fontNames.length);

        String fontName = fontNames[index];        int style = this.r.nextInt(4);

        int size = this.r.nextInt(5) + 24;

        return new Font(fontName, style, size);

    }    private void drawLine (BufferedImage image){

        int num = 3;

        Graphics2D g2=(Graphics2D)image.getGraphics();        for(int i=0;i<num;i++){

            int x1=r.nextInt(w);

            int y1=r.nextInt(h);

            int x2=r.nextInt(w);

            int y2=r.nextInt(h);

            g2.setStroke(new BasicStroke(1.5F));

            g2.setColor(Color.BLUE);            g2.drawLine(x1,y1,x2,y2);        }    }    private char randomChar(){

        int index=r.nextInt(this.codes.length());

        return this.codes.charAt(index);

    }    private BufferedImage createImage(){

        BufferedImage image=new BufferedImage(this.w,this.h,BufferedImage.TYPE_INT_RGB);//BufferedImage.TYPE_INT_RGB

        Graphics2D g2 = (Graphics2D)image.getGraphics();

        g2.setColor(this.bgColor);

        g2.fillRect(0,0,this.w,this.h);

        return image;

    }

    public BufferedImage getImage(){

        BufferedImage image=createImage();

        Graphics2D g2=(Graphics2D)image.getGraphics();

        StringBuilder sb&amp;nbsp;= new StringBuilder();

        for(int i =0;i<4;i++){

            String s= randomChar()+"";

            sb.append(s);

            float x= i*1.0F*this.w/4.0F;

            g2.setFont(randomFont());

            g2.setColor(randomColor());

            g2.drawString(s,x,this.h-5);

        }

        this.text=sb.toString();

        drawLine(image);//添加干扰线

        return image;

    }

    //返回验证码上的文本

    public String getText(){

        return this.text;

    }

    //保存图片到指定的输出流

    public static void output(BufferedImage image, OutputStream out)

            throws IOException {

        ImageIO.write(image,"JPEG",out);

    }

    public static void main(String[] args) throws IOException {

        VerifyCode vc=new VerifyCode();

        BufferedImage bi = vc.getImage();

        VerifyCode.output(bi,new FileOutputStream("E:\\work\\temp\\xxx.jpg"));

        System.out.println("图片中的验证是:"+vc.getText());

    }

}

使用

 

/**

     * 生成随机验证码     */    @RequestMapping("randomVerifyCode.do")

    public ResponseBean randomVerifyCode() throws IOException {        VerifyCode vc = new VerifyCode();        BufferedImage bi = vc.getImage();        //VerifyCode.output(bi,response.getOutputStream());

        ByteArrayOutputStream out = new ByteArrayOutputStream();        ImageIO.write(bi, "png", out);

        byte[] bytes = out.toByteArray();

        String str = Base64.encode(bytes);        str = "data:image/png;base64," + str;

        String uuid = IdUtil.simpleUUID();        Map<String,String> resultMap = Maps.newHashMap();        resultMap.put("base64", str);

        resultMap.put("uuid", uuid);

        //save redis        String key = "RandomVerify:" + uuid;

        RedisUtil.set(key, vc.getText(), 180);

        return ResultUtil.success(resultMap);

    }

验证方法

 

/**

     * 账号登录

     * @param session

     * @param phone

     * @param pwd

     * @param entryType

     * @return

     */

    @RequestMapping("accountLogin.do")

    public ResponseBean accountLogin(final HttpSession session, String phone, String pwd, String entryType,

                                     String uuid, String randomCerifyCode){

        //校验验证码

        MeenoAssert.hasLength(randomCerifyCode,"randomCerifyCode can not empty!");

        Object randomCerifyCodeObj = RedisUtil.get("RandomVerify:" + uuid);

        MeenoAssert.notNull(randomCerifyCodeObj, CErrEnum.RANDOM_VERIFY_CODE_FAILURE);

        MeenoAssert.isTrue(randomCerifyCode.toLowerCase().equals(randomCerifyCodeObj.toString().toLowerCase()), CErrEnum.RANDOM_VERIFY_CODE_ERR);

        LoginResult loginResult = this.employeeService.accountLogin(session, phone, pwd, entryType);

        EmpView employeeView = this.employeeService.getEmployee(loginResult.getUserInfo().getId());

        Map<String,Object> resultMap = Maps.newHashMap();

        resultMap.put("loginResult", loginResult);

        resultMap.put("employee", employeeView);

        return ResultUtil.success(resultMap);

    } 



关注“职坐标在线”公众号,免费获取最新技术干货教程资源哦!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程