java 图片验证码

2023-11-11

image.jsp

//主要是采用下面导入的几个包来绘制 验证码图片

<%@ page import = "java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>   
<%@ page import = "java.io.OutputStream" %>   
<%@ page pageEncoding= "gbk" %>   
<%!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);   
        }%>   
<%   
                 try {   
                response.setHeader( "Pragma" , "No-cache" );   
                response.setHeader( "Cache-Control" , "no-cache" );   
                response.setDateHeader( "Expires" , 0 );   
                 int width = 60 , height = 20 ;   
                BufferedImage image = new BufferedImage(width, height,   
                BufferedImage.TYPE_INT_RGB);   
                OutputStream os = response.getOutputStream();   
                Graphics g = image.getGraphics();   
                Random random = new Random();   
                g.setColor(getRandColor( 200 , 250 ));   
                g.fillRect( 0 , 0 , width, height);   
  
                g.setFont( new Font( "Times New Roman" , Font.PLAIN, 18 ));   
                g.setColor(getRandColor( 150 , 200 ));   
                 for ( int i = 0 ; i < 155 ; i++) {   
                         int x = random.nextInt(width);   
                         int y = random.nextInt(height);   
                         int xl = random.nextInt( 12 );   
                         int yl = random.nextInt( 12 );   
                        g.drawLine(x, y, x + xl, y + yl);   
                }   
                String sRand = "" ;   
                 for ( int i = 0 ; i < 4 ; i++) {   
                        String rand = String.valueOf(random.nextInt( 10 ));   
                        sRand += rand;   
                        g.setColor( new Color( 20 + random.nextInt( 110 ), 20 + random   
                        .nextInt( 110 ), 20 + random.nextInt( 110 )));   
                        g.drawString(rand, 13 * i + 6 , 16 );   
                }   
                session.setAttribute( "rand" , sRand);   
                g.dispose();   
  
                ImageIO.write(image, "JPEG" , os);   
                os.flush();   
                os.close();   
                os = null ;   
                response.flushBuffer();   
                out.clear();   
                out = pageContext.pushBody();   
        } catch (IllegalStateException e) {   
                System.out.println(e.getMessage());   
                e.printStackTrace();   
        }   
%>  

//我把java代码封装到jsp里面,为了以下操作方便。

login.jsp(登录界面)

//我不把全部代码提出来了,既然这次主讲图片验证码,那么就把图片验证码部分代码贴出。

验&nbsp;证&nbsp;码

:<input name="code" type="text" size="6" />

//pages/common/image.jsp是以上定义的image.jsp的路径
<img name="pic" src="pages/common/image.jsp" width="69" height="20"
                                                            style="vertical-align: bottom" onClick="reloadImage(this);"
                                                            alt="图片看不清,点击换一张" onMouseOver="changeCursor(this);">

login.js

/**这个我也把关于验证码的js提出,如悬停图片时,鼠标变 手型,点击如片刷新 验证码**/

function changeCursor(obj)
{   
obj.style.cursor = "pointer";
}


function reloadImage()
{

//此JS是为了刷心验证码图片,src同样是以上login.jsp写的路径,rnd是JS内置函数Math.random()

//生成的一个随机数,这个必须要写,如果不写不能达到刷新的效果,原因是 必须跟随一个变量,

//不能是恒量,您也可以采取系统当前时间,只要保证每次点击图片保证发生变化即可
this.src ="pages/common/image.jsp?rnd="+Math.random();
}

UserAction.java

//如何判断验证码是否正确,只要下面俩句话

//rand即为图片验证上面的数字,code是login.jsp 中from用户输入的验证码文本框的值

String rand = request.getSession().getAttribute("rand").toString();
String code = request.getParameter("code");

//只需判断此二值即可

if (code.equals(rand)) {

       System.out.println("一致");

}else

{

       System.out.println("不一致");

       //这个仅仅为了让您看个结果,您可以根据自己的业务逻辑进行下一步操作,

      //如继续判断用户名密码是否都符合条件,执行 登录操作

}

ps: 在您把这些贴到您的项目时,可能需要稍微调调,上面的// 就是为了让您明白那是我给你的注释,你把//即后面的注解可以都删掉即可,希望对您有帮助,祝君学习成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 图片验证码 的相关文章

随机推荐

  • Gradle 的编译周期

    Project build gradle 多个Task 多个action 一个代码块 在编译过程中 Gradle 会根据 build 相关文件 聚合所有的project和task 执行task 中的 action 依赖逻辑 几乎所有的Tas
  • 2018网易前端实习笔试题

    前端时间做了网易前端实习的笔试题 偶像想起 总结一下 前面的选择题 我就不一一细说了 主要考察的是对于前端的基础 以及计算机基础 这次主要讲下算法题 所有算法我均用js所写 不同语言思路均相同 以下都是我对题目的简述 1 小易学了集合 已知
  • CTF show WEB7-8

    题目网站https ctf show web7 点开其中一篇文章 输入id 1 1存在全部文章内容 说明为整形注入 1 爆库名 web7 当输入为id 1 or ascii substr database 1 1 119时出现文章内容 证明
  • 如何制作 linux 系统 U盘启动盘

    原贴 如何制作 linux 系统 U盘启动盘 Will kkc的博客 CSDN博客 linux系统启动盘 1 制作linux 系统的U盘启动盘 需要选择ISO 模式 给大家推荐几个制作相关软件以及相关制作过程 UltraISO rufus
  • Nginx将日志输送到Rsyslog服务

    直接使用Nginx记录日志 在多台服务器的情况下日志会过于分散不容易管理 不过nginx在1 7 1版本以后 可以使用Rsyslog来记录日志 配置过程如下 一 Nginx配置文件 该配置也可以实现将nginx日志通过rsyslog服务输送
  • PHP中的正规表达式

    PHP继承 NIX的一贯传统 完全支持正规表达式的处理 正规表达式提供了一种高级的 但不直观的字符串匹配和处理的方法 用过PERL的正规表达式的朋友都知道 正规表达式的功能非常强大 但学起来不是那么容易 比如 这段有效却难以理解的代码足够使
  • 大数据毕业设计 校园学生一卡通数据分析与可视化 - python

    文章目录 0 项目简介 任务 1数据导入与预处理 任务 1 1 探查数据质量并进行缺失值和异常值处理 1 1 2检查重复值 1 1 3数据内容总览 1 1 4数据分布总览 1 1 5消费金额和消费次数观察消费金额和消费次数的散点图 1 1
  • 企业微信 vue ios 出现 63002,INVALID SIGNATURE问题

    下面是官网的说法 可以先按下面的方法进行排查排查 概述 微信开放文档 1 确认签名算法正确 可用http mp weixin qq com debug cgi bin sandbox t jsapisign 页面工具进行校验 2 确认con
  • [创业之路-71] :创业思维与打工思维的区别

    其实打工思维和创业思维最核心的本质区别是你是否愿意去尝试 很多时候我打工的时候老板没发现我的潜质 所以我去创业了 这个没有 你打工的时候一定有一项极其长的长项 只不过当时你可能也没意识到 老板没意识到 所谓创业者和职场人没有本质的差异 但创
  • 如何使用Python的Pyecharts制作漂亮的Tree 树图?

    Pyecharts是一个基于Echarts的Python数据可视化库 可以很容易地生成各种漂亮的图表 本文介绍如何使用Pyecharts绘制Tree树图 安装Pyecharts 使用pip安装Pyecharts pip install py
  • 在IDE中使用Bito - 一个不需要VPN就可以使用的chatgpt

    文章目录 在IDE中使用Bito 什么是Bito 为什么要使用Bito Bito可以做什么 如何在IDE中安装Bito 使用Bito 在IDE中使用Bito 什么是Bito 用他自己的介绍就是 Bito s AI helps develop
  • fetch整个仓库 github_【每日github】B站开源的播放器、markdown插件等

    第15篇 1 Modernizr Modernizr Modernizr帮助我们检测浏览器是否实现了某个feature 如果实现了那么开发人员就可以充分利用这个feature做一些工作 反之没有实现开发人员也好提供一个fallback 所以
  • neo4j清空数据库

    版本为 neo4j community 4 4 6 使用py2neo删除 fimport py2neo from py2neo import Graph Node Relationship NodeMatcher g Graph http
  • Git(六):基本命令(2):复位、修改、分支合并与日志

    目录 9 reset 复位 9 1 描述 9 2 基本用法 9 2 1 回滚添加操作 9 2 2 回滚最近一次提交 9 2 3 回滚最近几次提交 9 2 4 回滚 pull 9 2 5 回滚 merge 9 2 6 区别 9 2 7 中断的
  • Velocity不用愁!Velocity系统的前端工程化之路

    Velocity是一个基于Java的Web页面模版引擎 十多年前 Velocity将Java代码从Web页面中分离出来 使得开发者能够并行网页开发和Java开发 随着十年前后端分离的浪潮涌动 回首再面对这些基于Velocity的旧系统 无论
  • 狂神说Linux学习笔记整理

    1 Linux简介 Linux 全称GNU Linux 是一种免费使用和自由传播的类UNIX操作系统 其内核由林纳斯 本纳第克特 托瓦兹于1991年10月5日首次发布 它主要受到Minix和Unix思想的启发 是一个基于POSIX的多用户
  • 最强Http缓存策略之强缓存和协商缓存的详解与应用实例

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地 以便下次请求时能够直接从缓存中获取资源 从而减少网络请求次数 提高网页的加载速度和用户体验 缓存分为强缓存和协商缓存两种模式 一 强缓存 强缓存是指浏览器直接从本地缓存中获取
  • Mybatis Plus 入门 简单的CRUD 使用详解 条件查询 分页查询 DML操作 MP代码生成器

    Mybatis Plus入门 MP是 MybatisPlus 简称MP 是一个 Mybatis 的增强工具 在 Mybatis 的基础上只做增强不做改变 MP为简化开发 提高效率而生 它已经封装好了单表curd方法 我们直接调用这些方法就能
  • java引入bean代码_Spring学习笔记之通过Java代码装配Bean

    自建博客地址 https bytelife net 欢迎访问 本文为博客自动同步文章 为了更好的阅读体验 建议您移步至我的博客 虽然很多场景下可以使用组件扫描和自动装配来实现Spring的自动化配置 但有些时候自动化配置的方案是行不通的 因
  • java 图片验证码

    image jsp 主要是采用下面导入的几个包来绘制 验证码图片