jsp验证码实现代码

2023-11-01

1.后台java代码

package com.bobo.base.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>Title:用于产生校验码的servlet类</p>
 * <p>Description: 用于产生校验码的servlet类</p>
 * @author  
 * @version 1.0 2010-09-05
 */

@SuppressWarnings("serial")
public class CheckCodeServlet extends HttpServlet {
    
	public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    //设置页面不缓存
    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);

    // 获取图形上下文
    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(new Color());
    //g.drawRect(0, 0, width - 1, height - 1);


    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160, 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);
    }

    // 取随机产生的认证码(4位数字)
    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
    request.getSession().setAttribute("checkCode", sRand);

    // 图象生效
    g.dispose();

    // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
}
 /**
  * 获取随机颜色
  * @param fc
  * @param bc
  * @return
  */	
private	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);
	}


}

2.web.xml配置

<servlet>
    <servlet-name>checkCodeServlet</servlet-name>
    <servlet-class>com.bobo.base.servlet.CheckCodeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>checkCodeServlet</servlet-name>
    <url-pattern>/checkCode.jpg</url-pattern>
  </servlet-mapping>

3.jsp页面调用

 <tr>
        <th>验证码:</th>
	<td><input  id="checkCode" name="checkCode" size="30" maxlength="6" type="text" value="" style="ime-mode:disabled"/><img src='checkCode.jpg' class="code" /></td> 
</tr>

4.java验证代码:

session中拿到checkCode的值与jsp页面传入的值checkCode进行比较。


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

jsp验证码实现代码 的相关文章

随机推荐

  • java设置多个数据源

    1 设置config properties文件 设置两个数据库连接 2 设置spring context xml文件 定义名为testDataSource和dataSource两个连接
  • LeetCode刷题顺序(新手入门)

    本刷题策略为leetcode官方的新手村策略 跟着主页官方的新手村策略刷题 按照每天刷三简单题或两中等题或一难题的速度刷题 每天预计花费1 5h 下面的顺序是探索卡中的顺序 数组 分为三部分 1 做好初始定义 2 运用基础算法思想 3 双索
  • 蛋白质组学数据的归一化/标准化处理

    1 前言 目的 调整由于技术 如处理 上样 预分 仪器等造成的样本间误差 这实际上是一种数据缩放的方法 一般在一个表达矩阵中 会涉及到多个样本 其表达量差异比较大 不能直接进行比较 比如某个样本表达量很大 在总体中就会占据绝对领导地位 这样
  • 邮件钓鱼的防守策略

    一 攻击背景 在历年的实战攻防演练中 人的漏洞是网络安全最大的脆弱点 而钓鱼攻击就是从内部攻破堡垒至关重要的手段 攻击者通过伪装成可信来源发送虚假邮件 诱导接收者点击恶意链接 提供敏感信息或执行恶意附件 从而获取机密信息或入侵系统 因此 在
  • MATLAB 之 基本概述

    文章目录 一 MATLAB 主要功能 1 数值计算功能 2 符号计算功能 3 绘图功能 4 程序设计语言功能 5 工具箱的扩展功能 二 MATLAB 操作界面 1 主窗口 2 命令行窗口 3 当前文件夹窗口 4 工作区窗口 5 搜索路径 三
  • [leetcode 周赛 149] 1154 一年中的第几天

    目录 1154 Day of the Year 一年中的第几天 描述 思路 代码实现 1154 Day of the Year 一年中的第几天 描述 给你一个按 YYYY MM DD 格式表示日期的字符串 date 请你计算并返回该日期是当
  • 【error】Lock wait timeout exceeded; try restarting transaction(mysql)事务锁

    目录 1 报错信息 2 解决方案 2 1 方案一 2 2 方案二 2 3 方案三 3 补充说明 3 1 三张表字段说明 原文链接 1 报错信息 背景 在做更新操作时 电脑重启了 重新运行mysql语句时报以下错误 报错信息 Lock wai
  • SQL中分组的一些用法group_concat

    分组查询 后面一篇文章我们将介绍MySQL的聚合函数 https blog csdn net qq 41453285 article details 88318318 group by通常与聚合函数放在一起使用 分组查询允许把数据分为多个逻
  • 高性能Mysql——分区表详解

    文章目录 分表和分区 分表和分区的区别 分表和分区联系呢 分区表分区方式 分区管理 分区表注意事项 分表和分区 分表 MySQL 的分表是真正的分表 一张表分成很多表后 每一个小表都是完整的一张表 都对应三个文件 一个 MYD数据文件 MY
  • html做群聊通讯方法,websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信 从而取代浪费资源的长轮询 在此协议的基础上 可以实现前后端数据 多端数据 真正的实时响应 在学习WebSocket的过程中 实现了一个简化版群聊 过程和代码详细记录在这篇文章中 1 概述 1
  • 【转】JWT 登录认证及 token 自动续期方案解读

    转自 https mp weixin qq com s X6Xsxgbfvbf3JCa0i7q4 A 要实现认证功能 很容易就会想到 JWT 或者 Session 但是两者有啥区别 各自有什么优缺点 应该选择谁 JWT 和 Session
  • Java线程随笔

    目录 守护线程 线程可见性 线程时序性 线程的中断机制 守护线程 基本概念 守护线程可以简单理解为后台运行线程 守护线程不需要关心他的结束问题 java垃圾回收就是一个守护线程 例如你的应用程序运行时需要播放音乐 如果将播放音乐这个线程设置
  • iOS下XMPP开发之xmppFramework框架的导入步骤和介绍

    一个将要开发xmpp的项目 建议在项目刚创建就导入框架 这样可以避免一些自己操作失误造成不必要的损失 xmpp中最常用的框架就是 xmppFrameWork 第一种方法直接拖 1 gt 拖入文件夹 在网盘链接的xmppFramework文件
  • 【python手写算法】numpy实现简易神经网络和反向传播算法【1】

    import numpy as np def dense A W Z np matmul A W 矩阵乘法 return 1 1 np exp Z if name main leanring rate 100 A np array 200
  • 你真的懂JavaScript吗

    放在前面 本文原文的标题是 So you think you know JavaScript 在下感觉有些标题党了 不过看了下文章的链接还是很不错的 原文作者是由几个问题展开了说明 问题 1 浏览器的console里会打印出什么 var a
  • 黑客是如何获取足够的流量以支撑其发动DDOS攻击?

    对计算有一些了解的朋友可能都会知道DDoS是一种互联网最普及的攻击方式 也是一些黑客的初级入门的技巧 每一次进行大规模的DDoS的攻击 那打出来的流量都让人咂舌 动静大而且波及极为广阔 DDoS要的就是流量 大多数黑客基本上为获取流量而不择
  • 数字电路设计之verilog的门级描述

    使用verilog的数字电路设计 一般会有晶体管级的描述 门级描述 RTL 行为描述 我们接触得比较多的就是后面两种 前两种更少涉及 现在就说一下门级描述吧 门级描述就是使用各种逻辑门对组合逻辑进行描述 举个栗子 与或非门 这里的and o
  • Unity iPhoneX适配方案【NGUI&UGUI】

    本文作者旨在通过改锚点的方式 分别实现在NGUI和UGUI上的iPhone X适配技术方案 并结合自身项目经验 阐述了主要的实现细节 希望能对广大游戏开发团队有借鉴意义 适配来源 按照苹果官方人机界面指南 Apple 开发者中心 在iPho
  • python+django乡村居民数据的可视化平台

    本论文主要论述了如何使用Django框架开发一个乡村振兴数据的可视化平台 本系统将严格按照软件开发流程进行各个阶段的工作 采用B S架构 面向对象编程思想进行项目开发 在引言中 作者将论述乡村振兴数据的可视化平台的当前背景以及系统开发的目的
  • jsp验证码实现代码

    1 后台java代码 package com bobo base servlet import java awt Color import java awt Font import java awt Graphics import java