JSP页面使用Servlet制作图形验证码

本文给大家分享的是JSP验证码的制作,通过Servlet生成图形验证码,调用非常方便,希望对大家有所帮助。

在《JS+CSS3制作图形验证码》一文中给大家分享过一个前端验证的验证码,利用JS和CSS3的transform属性里的rotate设置旋转进行制作。

今天给大家分享的是JSP验证码的制作,通过Servlet生成图形验证码。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
/**
* 产生验证码图片的servlet
*/
public class ValidateCodeServlet extends HttpServlet {
private static final long serialVersionUID = -5051097528828603895L;
/**
* 验证码session的名称。
*/
private static final String SESSION_ATT_NAME = "validateCode";
/**
* 验证码图片的宽度。
*/
private int width = 100;
/**
* 验证码图片的高度。
*/
private int height = 30;
/**
* 验证码字符个数
*/
private int codeCount = 4;
/**
* 字体高度
*/
private int fontHeight;
/**
* 第一个字符的x轴值,因为后面的字符坐标依次递增,所以它们的x轴值是codeX的倍数
*/ 
private int codeX; 
/**
* codeY ,验证字符的y轴值,因为并行所以值一样
*/
private int codeY;
/**
* codeSequence 表示字符允许出现的序列值
*/
char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
/** 
* 初始化验证图片属性 
*/
public void init() throws ServletException {
// 从web.xml中获取初始信息 
// 宽度
String strWidth = this.getInitParameter("width");
// 高度
String strHeight = this.getInitParameter("height");
// 字符个数
String strCodeCount = this.getInitParameter("codeCount");
// 将配置的信息转换成数值
try {
if (strWidth != null && strWidth.length() != 0) {
width = Integer.parseInt(strWidth);
}
if (strHeight != null && strHeight.length() != 0) {
height = Integer.parseInt(strHeight);
}
if (strCodeCount != null && strCodeCount.length() != 0) { 
codeCount = Integer.parseInt(strCodeCount);
}
} catch (NumberFormatException e) {
e.printStackTrace(); 
} 
//width-4 除去左右多余的位置,使验证码更加集中显示,减得越多越集中。
//codeCount+1 //等比分配显示的宽度,包括左右两边的空格 
codeX = (width-4) / (codeCount+1);
//height - 10 集中显示验证码 
fontHeight = height - 10; 
codeY = height - 7; 
} 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
// 定义图像buffer 
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
Graphics2D gd = buffImg.createGraphics(); 
// 创建一个随机数生成器类
Random random = new Random(); 
// 将图像填充为白色 
gd.setColor(Color.LIGHT_GRAY); 
gd.fillRect(0, 0, width, height); 
// 创建字体,字体的大小应该根据图片的高度来定。 
Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
// 设置字体。 
gd.setFont(font); 
// 画边框。 
gd.setColor(Color.BLACK); 
gd.drawRect(0, 0, width - 1, height - 1);
// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。 
gd.setColor(Color.gray); 
for (int i = 0; i < 16; i++) { 
int x = random.nextInt(width); 
int y = random.nextInt(height); 
int xl = random.nextInt(12); 
int yl = random.nextInt(12); 
gd.drawLine(x, y, x + xl, y + yl); 
} 
// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 
StringBuffer randomCode = new StringBuffer(); 
int red = 0, green = 0, blue = 0; 
// 随机产生codeCount数字的验证码。 
for (int i = 0; i < codeCount; i++) { 
// 得到随机产生的验证码数字。 
String strRand = String.valueOf(codeSequence[random.nextInt(36)]); 
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。 
red = random.nextInt(255); 
green = random.nextInt(255); 
blue = random.nextInt(255); 
// 用随机产生的颜色将验证码绘制到图像中。 
gd.setColor(new Color(red,green,blue)); 
gd.drawString(strRand, (i + 1) * codeX, codeY); 
// 将产生的四个随机数组合在一起。 
randomCode.append(strRand); 
} 
// 将四位数字的验证码保存到Session中。 
HttpSession session = request.getSession(); 
session.setAttribute(SESSION_ATT_NAME, randomCode.toString()); 
// 禁止图像缓存。 
response.setHeader("Pragma", "no-cache"); 
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); 
response.setContentType("image/jpeg"); 
// 将图像输出到Servlet输出流中。 
ServletOutputStream sos = response.getOutputStream(); 
ImageIO.write(buffImg, "jpeg", sos); 
sos.close();
} 

public static String getValidateCode(HttpServletRequest request){ 
HttpSession session = request.getSession(); 
Object obj = session.getAttribute(SESSION_ATT_NAME); 
if(obj!=null){ 
return obj.toString(); 
}
return "";
} 

public static void removeValidateCode(HttpServletRequest request){
HttpSession session = request.getSession(); 
session.removeAttribute(SESSION_ATT_NAME); 
    }
}

图形验证码servlet方法功能描述:

JSP页面使用Servlet制作图形验证码

web.xml配置:

JSP页面使用Servlet制作图形验证码

125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/11180.html

(0)
江山如画的头像江山如画管理团队
上一篇 2022年12月1日 下午1:53
下一篇 2022年12月1日 下午2:18

99%的人还看了以下文章

  • 第一个Spring MVC 项目:Hello World(Eclipse版)

    125建站网前面分享了《Spring框架概述》,新学习的同学可以先阅读引文章,今天给大家分享第一个Spring MVC实战项目:Hello World 目录  一、MVC概要 二、Spring MVC介绍 三、第一个Spring MVC 项目:Hello World(Eclipse版) 3.1、通过Maven新建一个Web项目 3.2、添加依赖的jar包 3…

    2023年1月24日 编程开发
    5590
  • Python数据分析及可视化,科学计算练习题

    第一章 单元测试 1、 问题:数据分析是指通过分析手段、方法和技巧对准备好的数据进行探索、分析,从中发现因果关系、内部联系和业务规则,为商业提供决策参考。( )选项:A:对B:错答案: 【对】 2、 问题:Anaconda中包含了conda、Python在内的超过18个科学包及其依赖项。( )选项:A:对B:错答案: 【对】 3、 问题:数据分析是一个有目的…

    2022年1月29日
    11.2K1
  • MVC详解:模型(Model)-视图(View)-控制器(Controller)

    MVC(模型-视图-控制结构)是软件开发中常用的一种架构模式。它强制性的将输入、处理和输出分开。使应用程序被分成三个核心部件:模型 (Model)、视图(View)和控制(Controller)。它们各自处理自己的任务,有效地分离存储数据和展示数据功能模块以降低它们之间的耦合度。 MVC体系结构: 模型层主要负责保存和访问业务数据,执行业务逻辑和操作。这一层…

    2020年2月23日
    4.6K0
  • python 循环语句的应用:水仙花数判断及爱因斯坦阶梯编程

    一、水仙花数判断程序 1.任务内容: 水仙花数是一个三位整数,如153是一个水仙花数,是因为该数的百位的立方、十位的立方、个位的立方和等于该数本身,如下所示: 2.程序编写要求: 使用for语句完成; 统计水仙花数个数的值保存到变量中,要求自动进行统计 •输出结果如下所示: 153 是水仙数370 是水仙数371 是水仙数407 是水仙数三位数中有4个水仙数…

    2022年5月11日
    1.7K1
  • myeclipse集成的tomcat在哪个目录下

    myeclipse集成了Tomcat服务器,本文介绍了myeclipse集成的tomcat在哪个目录下?查看myeclipse集成的tomcat在哪个目录下的方法

    2020年2月6日
    2.6K0
  • opencv_python-4.4.0-cp38-cp38-win_amd64.whl is not a supported wheel on this platform

    ERROR: opencv_python-4.4.0-cp38-cp38-win_amd64.whl is not a supported wheel on this platform. WARNING: You are using pip version 20.2.3; however, version 20.3.1 is available.You sh…

    编程开发 2020年12月8日
    4.0K0

发表回复

登录后才能评论