千家信息网

Java怎么实现后台验证码生成

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇"Java怎么实现后台验证码生成"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"J
千家信息网最后更新 2025年01月17日Java怎么实现后台验证码生成

这篇"Java怎么实现后台验证码生成"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Java怎么实现后台验证码生成"文章吧。

1.适用需求

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

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

无(普通标签)

3.功能点实现思路

1)前台思路:

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

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

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

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

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

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

前台部分代码:

/*验证码输入框*/      /*验证码图片*/  //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;    }}

以上就是关于"Java怎么实现后台验证码生成"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

验证 后台 生成 图片 内容 前台 功能 字符 思路 代码 属性 方法 码字 干扰 事件 地址 文件 文章 标签 浏览器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 管理网络安全性 小鱼易连手机登录无法连接服务器 哪家云服务器最便宜 苏州嵌入式软件开发如何收费 什么被称为数据库 富国互联网科技和富国新动力 海淀区智能软件开发技术规范 如何查看数据库计算机主机名 服务器 登陆 修改服务器的安全认证模式 数据库三种数据抽象 电脑网络安全优化 科松门禁数据库操作说明 德州微信公众号软件开发企业 临沂app定制软件开发企业 learn软件开发营销策略 计算机网络技术研究生就业前景 云服务器和服务器怎么区分 4g打不开网站是服务器的问题吗 集合并数据库 服务器ssh管理 杭州市青橄榄网络技术有限公司 文明与征服服务器列表 深圳乾高网络技术有限公司 网络安全服务定义 金蝶迷你版数据库下载 陕西汽车网络技术有限公司 哪些企业服务器放在贵州云主机 腾讯公司服务器的linux版本 高校服务器为什么不上云
0