问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用ServletJSP动态生成图像验证码

发布网友 发布时间:2022-04-27 03:35

我来回答

1个回答

热心网友 时间:2022-04-21 13:59

原理:

1.生成一个随机字符串,

2.将字符串放在Session中

3.将字符串绘制在一个图片中

4,将图片用流的方式输出

代码:

/********************************************************************************

 * Project Name[JavaEE_Web]

 * File Name     [CaptchaGeneratorServlet.java]

 * Creation Date [2015-01-01]

 * 

 * Copyright© ge.y.yang@gmail.com All Rights Reserved

 * 

 * Work hard, play harder, think big and keep fit

 ********************************************************************************/
package servlet.cases;

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

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

/**

 * 生成验证码

 * 

 * @author 不落的太阳(Sean Yang aka ShortPeace)

 * @version 1.0

 * @since jdk 1.8

 * 

 */
@WebServlet(name = "CaptchaGeneratorServlet", urlPatterns = "/captchaCode")
public class CaptchaGeneratorServlet extends HttpServlet {

private static final long serialVersionUID = 1309284118818772154L;

public static final String CAPTCHA_CODE_KEY = "CAPTCHA_CODE_KEY";

// 设置验证图片的宽度, 高度, 验证码字符的个数


private int width = 152;
private int height = 40;
private int codeCount = 6;

// 验证码字体的高度


private int fontHeight = 4;

// 验证码中的单个字符基线. 即: 验证码中的单个字符位于验证码图形左上角的[codeX, codeY]位置处


private int codeX = 0;
private int codeY = 0;

// 验证码由哪些字符组成


char[] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789".toCharArray();

// 初始化验证码图形属性


@Override
public void init() {
fontHeight = height - 2;
codeX = width / (codeCount + 2);
codeY = height - 4;
}

@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 定义一个类型为BufferedImage.TYPE_INT_RGB类型的图像缓存


BufferedImage image = null;
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 在image中创建一个Graphics2D图像


Graphics2D graphics = null;
graphics = image.createGraphics();

// 设置一个颜色, 使用Graphics2D对象的后续图形使用这个颜色


graphics.setColor(Color.WHITE);

// 填充一个指定的矩形:


// x 要填充矩形的x坐标; y 要填充矩形的y坐标; width 要填充矩形的宽度; height 要填充矩形的高度


graphics.fillRect(0, 0, width, height);

// 创建一个Font对象: name字体名称; style Font的样式常量; size Font的点大小


Font font = null;
font = new Font("", Font.BOLD, fontHeight);
// 使用Graphics2D对象的后续图形使用此字体


graphics.setFont(font);

graphics.setColor(Color.BLACK);

// 绘制指定矩形的边框, 绘制出的矩形将比构件宽一个也高一个像素


graphics.drawRect(0, 0, width - 1, height - 1);

// 随机产生15条干扰线, 使图像中的认证码不易被其它程序探测到


Random random = null;
random = new Random();
graphics.setColor(Color.GREEN);
for (int i = 0; i < 15; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(20);
int y1 = random.nextInt(20);
graphics.drawLine(x, y, x + x1, y + y1);
}

// 创建captchaCode对象, 用于保存随机产生的验证码, 以便用户登录后进行验证


StringBuffer captchaCode;
captchaCode = new StringBuffer();

for (int i = 0; i < codeCount; i++) {
// 得到随机产生的验证码数字


String tempCode = null;
tempCode = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);

// 把正在产生的随机字符放入到StringBuffer中


captchaCode.append(tempCode);

// 用随机产生的颜色将验证码绘制到图像中


graphics.setColor(Color.BLUE);
graphics.drawString(tempCode, (i + 1) * codeX, codeY);
}

// 把captchaCode放入到HttpSession中


request.getSession().setAttribute(CAPTCHA_CODE_KEY, captchaCode.toString());

// 禁止图像缓存


response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);

// 将图像输出到输出流中


ServletOutputStream out = null;
out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
out.close();
}
}

JSP实例:Java实现随机验证码功能实例

//用随机产生的颜色将验证码绘制到图像中 g setColor(new Color(red green blue)); g drawString(strRand (i + ) * x codeY); //将产生的四个随机数组合在一起 randomCode append(strRand); } // 将四位数字的验证码保存到Session中 HttpSession session = req getSession(); session setA...

aippt自动生成工具

随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图、条形...

java怎么生成验证码图片

import javax.servlet.*;import javax.servlet.http.*;import java.awt.*;import java.awt.image.*;public class getImg extends HttpServlet { private Font mFont=new Font("宋体", Font.PLAIN,12);//设置字体 //处理post public void doPost(HttpServletRequest request,HttpServletResponse respons...

求:用JSP写的图书管理系统的毕业论文

动态生成含有随机验证码的图片,在生成图片的同时将验证码写入session中,与用户的登录输入比较。可有效的防止机器人登录。 GetDelete servlet servlet 处理图书、用户、日志的注销操作,根据返回值进行相应页面的跳转。 GetBookSubmit servlet 处理图书的入库和图书信息的修改,根据返回值进行相应页面的跳转。 GetUserSubmit s...

jsp和servlet有什么用(servlet和jsp)

3.JSP和Servlet相同点: JSP可以被看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP能够完成的工作,使用Servlet都可以完成,例如生成动态的页面; 由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。 4.JSP和Servlet的擅长方便不同: Servlet的实现方式是在java代码中嵌入HTML代码,...

JSP如何引用动态生成的html

public class JspFilter implements Filter { public void destroy() { // TODO 自动生成方法存根 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hreq = (HttpServletRequest) request; HttpServletResponse ...

Jsp和Servlet有什么区别

其实你可以用Servlet输出页面的,但是你会在java中写很多html的代码,看起来太不美观了。之后便有了JSP。JSP其实是HTML和JAVA的结合,它可以动态的展现HTML页面,JSP中的JAVA代码不多,而有了JSP,Servlet就不负责表现了,Servlet只负责逻辑的处理就可以了,把页面的展现工作都交给了JSP,这样分工就明确了...

纯JSP的结构相比JSP配合Servlet的缺点是什么?

的确,从实现逻辑上来讲,基本上Servlet能够实现的逻辑,JSP也能够实现,而且JSP还不用编译,修改起来十分方便。虽然JSP不能定义方法,但我们也可以写一个普通Java类来实现相关的工具方法,让JSP调用。过去有人说Servlet可以动态生成图像,而事实上JSP同样能够做到。看起来Servlet似乎没有任何用处了。但是,我...

servlet在jsp中的作用是什么?

客户端发送请求至服务器端;服务器将请求信息发送至Servlet Servlet生成响应内容并将其传给Server。响应内容动态生成,通常取决于客户端的请求 服务器将响应返回给客户端 Servlet看起来像是通常的Java程序。Servlet导入特定的属于Java Servlet API的包。因为是对象字节码,可动态地从网络加载,可以说Servlet对...

jsp动态包含和静态包含的区别

1.动态包含用的元素是page,而且有两种形式。静态包含用的是file,只有一种形式。2.生成的文件不同,静态的包含是将两个jsp文件二合一,生成一个以包含页面命名的servlet和class文件,动态包含的两个jsp文件各自生成自己的servlet和class文件。3. 传参方式一:&lt;jsp:include page=“a.jsp?param=123”/&gt;...

求eclipse 下开发jsp 的教程,eclipse版本为3.2 或3.3

7.4 在JSP中动态生成图像 7.5 小结 第二部分 JSP高级技术 第8章 JSP 2.0表达式语言(EL)8.1 表达式语言简介 8.2 表达式语言的使用 8.3 表达式求值 8.4 访问作用域变量 8.5 隐含对象 8.6 存取运算符 8.7 定义与使用函数 8.8 小结 第9章 JSP标准标签库(JSTL 1.1)9.1 JSTL简介 9....

手机号码生成器验证码 虚拟号码生成器验证码 验证码图片生成 生成手机号码软件接收验证码 验证码图像显示 后端传来验证码图像显示 图形验证码没有图 生成验证码 中文验证码生成
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
新轩逸保养一次多少钱? ...每个小长方形的周长是多少厘米?(你能想出几 铅的正常是多少合适 两个同样的长方形,长是8分米,宽4分米。把它们拼成一个长方形,它的周长... ...拼成一个大长方形拼成的长方形的周长是多少分米 ...长8分米,宽是4分米,如果把它们拼成一个长方形,这个长方形的周长是... ...如果把它们拼成长方形,这个长方形的周长是多少? ...把它们拼成一个正方形,周长是___分米;把它们拼成一个长方... 把两个边长是4分米的正方形拼成一个长方形,这个长方形的周长是___ ...长是8分米,宽是4分米.如果把它们拼成一个长方形,这个长方形的周长是... asp如何生成验证码图片? python怎么生成随机图形验证码 注册是有个图片验证,这个具体是怎么实现的? 图片验证怎么做的? 如何生成图片,例如验证码是怎样产生的 手机怎样连接到不见不散的小音响 不见不散便携音箱如何调音量? 不见不散LV950旅行者小音箱怎样把收音机功能调出来? 不见不散小音箱bv370能和台式电脑连接吗 音响不见不散没有声音怎么办? 淘宝的不见不散小音响有假货吗? 你们好,我向你们请交一下,我买了个不见不散插卡小音箱带有调频收音机的,现在收不到台了想恢复出厂设置 不见不散小音箱坏了可以修吗 不见不散小音箱播放时有滴滴的声音是什么问题? 问一下:python培训班怎么选择? 不见不散小音箱突然没声音了但是用耳机听就有声音是怎么回事啊 老牌不见不散小音箱忽然不识内存卡是啥原因? 不见不散小音箱开关时好时坏? 我的不见不散小音箱显视屏不亮了怎么办 爆炒文蛤需要那些材料,怎么样烧制? 如何生成图片,例如验证码是怎样产生的求大神帮助 javascript中验证码如何以图片形式生成 jsp图片验证码 用delphi怎么生成验证码的图片 求java语言随机生成图片验证码的程序代码,有详细注释最好,本人初学者,谢谢各位的帮忙!!! 酿海参怎么做? 鲁菜特色菜 扒酿海参怎么做? 海参简单做法? 海参早上怎么吃,做起来简单有快 海生正确的做法 海参如何让简单吃? 海参的做法有哪些?都有写什么口味的做法? 扒酿海参的营养成份 怎么才能快速整理iphone桌面图标 iPhone手机快速整理桌面应用图标,很多人都不知道! 怎么改变iphone图标布局 猪前腿肉好还是后腿肉好吃? 红烧肉用前腿肉还是五花肉 红烧肉买什么部位的肉 用哪个部位的猪肉做红烧肉好吃?