Java 登录输入的验证码

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: Java 登录输入的验证码

首先通过controller层进行业务数据访问如下:  

@RequestMapping(value = "/generVerifyCode",method = RequestMethod.GET)
    void imageVerifyCode(HttpServletResponse response)throws Exception {
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires",0);
        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        String code = ImageCodeUtils.generateVerifyCode(4);
        int w = 200,h = 80;
        ImageCodeUtils.outputImage(w, h, response.getOutputStream(), code);
    }


具体的业务生成代码如下:

public class ImageCodeUtils {
    //使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
    static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    static Random random = new Random();
    /**
     * 使用默认字符源码生成验证码
     * @param verifySize
     * @return
     */
     public static String generateVerifyCode(int verifySize){
       return generateVerifyCode(verifySize,VERIFY_CODES);
     }
    /**
     * 使用指定源生成验证码
     * @param verifySize
     * @param sources
     * @return
     */
     public static String generateVerifyCode(int verifySize,String sources){
         if(sources == null || sources.length() == 0){
             sources = VERIFY_CODES;
         }
         int codesLen = sources.length();
         Random rand = new Random(System.currentTimeMillis());
         StringBuilder verifyCode = new StringBuilder(verifySize);
         for(Integer i=0;i<verifySize;i++){
             verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));
         }
         return verifyCode.toString();
     }
    /**
     * 输出置顶验证码图片流
     * @param w
     * @param h
     * @param os
     * @param code
     * @throws Exception
     */
     public static void outputImage(int w, int h, OutputStream os,String code)throws Exception{        
         int verifySize = code.length();
         BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Random rand = new Random();
         Graphics2D gd = image.createGraphics();
         gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
         Color[] colors = new Color[5];
         Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,
                 Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
                 Color.PINK, Color.YELLOW };
         float[] fractions = new float[colors.length];
         for(int i = 0; i < colors.length; i++){
             colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
             fractions[i] = rand.nextFloat();
         }
         Arrays.sort(fractions);
         gd.setColor(new Color(250, 252, 253));// 设置边框色
         gd.fillRect(0, 0, w, h);
         gd.setColor(Color.WHITE);// 设置背景色
         gd.fillRect(0, 0, w, h);
         // 添加噪点
         float yawpRate = 0.1f;// 噪声率
         int area = (int) (yawpRate * w * h);
         for (int i = 0; i < area; i++) {
             int x = random.nextInt(w);
             int y = random.nextInt(h);
             int rgb = getRandomIntColor();
             image.setRGB(x, y, rgb);
         }
         //绘制干扰线
         Random random = new Random();
         gd.setColor(Color.gray);// 设置线条的颜色
         for (int i = 0; i < 16; i++) {
             int x = random.nextInt(w);
             int y = random.nextInt(h);
             int xl = random.nextInt(12);
             int yl = random.nextInt(12);
             gd.drawLine(x, y, x + xl, y + yl);
         }
         //shear(gd, w, h, Color.WHITE);// 使图片扭曲
         gd.setColor(getRandColor(100, 160));
         int fontSize = h-35;
         Font font = new Font("Fixedsys", Font.PLAIN,fontSize);
         gd.setFont(font);
         char[] chars = code.toCharArray();
         for(Integer i = 0; i < verifySize; i++){
             AffineTransform affine = new AffineTransform();
             affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
             gd.setTransform(affine);
             gd.setColor(new Color(20 + random.nextInt(110),20 + random.nextInt(110), 20 + random.nextInt(110)));
             gd.drawChars(chars, i, 1, (((w-10) / verifySize) * i + 5), h/2 + fontSize/2 - 10);
         }
         gd.dispose();
         ImageIO.write(image, "jpg", os);
     }
    private static int getRandomIntColor() {
        int[] rgb = getRandomRgb();
        int color = 0;
        for (int c : rgb) {
            color = color << 8;
            color = color | c;
        }
        return color;
    }
    private static int[] getRandomRgb() {
        int[] rgb = new int[3];
        for (int i = 0; i < 3; i++) {
            rgb[i] = random.nextInt(255);
        }
        return rgb;
    }
    public static  Color getRandColor(int fc,int bc){
         Random random = new Random();
         if(fc>255){
             fc=255;
         }
         if(bc>255){
             bc=255;
         }
         int r = fc + random.nextInt(bc-fc);
         int g = fc + random.nextInt(bc-fc);
         int b = fc + random.nextInt(bc-fc);
         return new Color(r,g,b);
     }


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
2月前
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
3天前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
12 2
|
20天前
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
26 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
2月前
|
资源调度 JavaScript API
nest.js + sms 实现短信验证码登录
本文介绍了在Nest.js框架中集成短信验证码登录的实现方案,详细阐述了使用阿里云短信服务的配置流程、资质申请、短信模板设置,并提供了API调用示例和工程代码的运行步骤。
nest.js + sms 实现短信验证码登录
|
2月前
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
2月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
|
2月前
【Azure 环境】中国区Azure B2C 是否支持手机验证码登录呢?
【Azure 环境】中国区Azure B2C 是否支持手机验证码登录呢?
|
4月前
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
48 1
|
4月前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
75 0
|
4月前
|
安全 前端开发 Java
Java Web项目登录报Session Error
Java Web项目登录报Session Error
33 0