java后台验证码生成的实现方法

 更新时间:2021年05月14日 10:48:26   作者:LonlySnow  
在我们使用进行系统开发时,为了提高系统的安全性,在登录的时候多数人都会要求输入验证,本文介绍了java后台验证码生成的实现方法,感兴趣的一起来了解一下

效果图如下:

1.适用需求

后台生成验证码,用于登陆验证。

2. 功能实现所需控件/文件:

无(普通标签)

3.功能点实现思路

1)前台思路:

(1)前台一个<input>用于输入验证码;一个<img>用于展示验证码。

(2)验证码生成以及展示,点击刷新功能,可以为<img>绑定click事件。

(3)click事件里面写ajax请求,通过后台生成处理好的带噪点的验证码图片。

注意:后台直接返回图片,不是验证码的字符!若返回字符,则验证码就失去了意义(前台很容易就可以获取验证码字符,进行多次恶意访问了)(这点考虑了系统安全性)

(4)关于返回的图片如何在<img>标签内展示

直接利用img的src属性,属性值为后台生成验证码的方法请求路径即可。当点击验证码的时候,再动态设置src属性即可(原访问地址+随机时间戳,防止同一路径浏览器不另作访问的问题)

前台部分代码:

/*验证码输入框*/
 
<input class="verifyInput"  name="verifyInput" placeholder="请输入验证码">   
 
 
/*验证码图片*/
 
<img class="verifyCode" onclick="changeCode()" src="getVerifyCode">
 
//src的getVerifyCode是后台访问地址;项目为SSM框架。
 
 
/*点击刷新验证码*/
 
function changeCode(){
 
         var src = " getVerifyCode?"+new Date().getTime(); //加时间戳,防止浏览器利用缓存
 
    $('.verifyCode').attr("src",src);                  //jQuery写法
 
}

2)后台思路:

后台思路很简单,利用BufferedImage类创建一张图片,再用Graphics2D对图片进行绘制(生成随机字符,添加噪点,干扰线)即可。注意生成的验证码字符串要放到session中,用于接下来登陆的验证码验证(当然也是后台)。

部分代码如下:

/* 获取验证码图片*/
 
         @RequestMapping("/getVerifyCode ")
 
         public void getVerificationCode(HttpServletResponse response,HttpServletRequest request) {
 
                   try {
 
                            int width=200;
 
                            int height=69;
 
         BufferedImage verifyImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
 
//生成对应宽高的初始图片
 
                            String randomText = VerifyCode.drawRandomText(width,height,verifyImg);
 
//单独的一个类方法,出于代码复用考虑,进行了封装。
 
//功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符                   
 
request.getSession().setAttribute("verifyCode", randomText);
 
                   response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别
 
                 OutputStream os = response.getOutputStream(); //获取文件输出流    
 
                 ImageIO.write(verifyImg,"png",os);//输出图片流
 
                 os.flush();
 
                 os.close();//关闭流
 
                   } catch (IOException e) {
 
                            this.logger.error(e.getMessage());
 
                            e.printStackTrace();
 
                   }
 
         }
/*对图片进行处理的类和方法*/
 
public class VerifyCode {  
 
    public static  String drawRandomText(int width,int height,BufferedImage verifyImg) {
             Graphics2D graphics = (Graphics2D)verifyImg.getGraphics();
             graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
             graphics.fillRect(0, 0, width, height);//填充背景
        graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));
        //数字和字母的组合
String baseNumLetter= = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
 
        StringBuffer sBuffer = new StringBuffer();
        int x = 10;  //旋转原点的 x 坐标
        String ch = "";
        Random random = new Random();
        for(int i = 0;i < 4;i++){
                 graphics.setColor(getRandomColor());
            //设置字体旋转角度
            int degree = random.nextInt() % 30;  //角度小于30度
            int dot = random.nextInt(baseNumLetter.length());
            ch = baseNumLetter.charAt(dot) + "";
            sBuffer.append(ch);
            //正向旋转
            graphics.rotate(degree * Math.PI / 180, x, 45);
            graphics.drawString(ch, x, 45);
            //反向旋转
            graphics.rotate(-degree * Math.PI / 180, x, 45);
            x += 48;
        }
        //画干扰线
        for (int i = 0; i <6; i++) {
            // 设置随机颜色
                 graphics.setColor(getRandomColor());
            // 随机画线
                 graphics.drawLine(random.nextInt(width), random.nextInt(height),
                                    random.nextInt(width), random.nextInt(height));
        }
        //添加噪点
        for(int i=0;i<30;i++){
                 int x1 = random.nextInt(width);
                 int y1 = random.nextInt(height);
                 graphics.setColor(getRandomColor());
                 graphics.fillRect(x1, y1, 2,2);
                 }
        return sBuffer.toString();
    }
    /**
     * 随机取色
 
     */
    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256),
                ran.nextInt(256), ran.nextInt(256));
        return color;
    }
}

4.功能实现心得:

验证码的功能实现思路很简单,从系统安全性和代码复用性这两点考虑,验证码必须后台生成,生成验证码的方法可以封装到静态工具类里。此外,后台用到许多Java自带的图片处理类值得学习。

 到此这篇关于java后台验证码生成的实现方法的文章就介绍到这了,更多相关java 验证码生成内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java实现图片相似度对比的示例代码

    基于Java实现图片相似度对比的示例代码

    很多时候我们需要将两个图片进行对比,确定两个图片的相似度。本文将利用Java和OpenCV库实现图片相似度对比,感兴趣的可以动手尝试一下
    2022-07-07
  • Java中超详细this与super的概念和用法

    Java中超详细this与super的概念和用法

    这篇文章主要介绍了Java中超详细this与super的概念和用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • springboot3整合knife4j详细图文教程(swagger增强)

    springboot3整合knife4j详细图文教程(swagger增强)

    开发api提供对应的接口规范进行联调或并行开发,api文档管理必不可少,常用的Knife4j基于swagger(依赖已经compile),可以进行管理,下面这篇文章主要给大家介绍了关于springboot3整合knife4j的相关资料,需要的朋友可以参考下
    2024-03-03
  • SpringSecurity微服务实战之公共模块详解

    SpringSecurity微服务实战之公共模块详解

    这篇文章主要为大家介绍了SpringSecurity微服务实战之公共模块详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java解析JSON数据时报错问题解决方案

    Java解析JSON数据时报错问题解决方案

    这篇文章主要介绍了Java解析JSON数据时报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java实现SM3withSM2签名和验证的基本示例

    Java实现SM3withSM2签名和验证的基本示例

    这篇文章主要介绍了Java实现SM3withSM2签名和验证的基本示例,SM3withSM2是一种在Java中使用的密码学算法组合,结合了椭圆曲线公钥密码算法SM2和密码哈希算法SM3,它主要用于数字签名和数据完整性校验,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • Java File类 mkdir 不能创建多层目录的解决

    Java File类 mkdir 不能创建多层目录的解决

    这篇文章主要介绍了Java File类 mkdir 不能创建多层目录的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring基于ProxyFactoryBean创建AOP代理

    Spring基于ProxyFactoryBean创建AOP代理

    这篇文章主要介绍了Spring基于ProxyFactoryBean创建AOP代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 基于java时区转换夏令时的问题及解决方法

    基于java时区转换夏令时的问题及解决方法

    下面小编就为大家分享一篇基于java时区转换夏令时的问题及解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • intellij idea设置统一JavaDoc模板的方法详解

    intellij idea设置统一JavaDoc模板的方法详解

    这篇文章主要介绍了intellij idea设置统一JavaDoc模板的方法详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论