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%的人还看了以下文章

  • python 集合使用案例:选修课统计

    相关阅读:python 集合的使用,案例详解 本学期学校共开设了3门选修课,一个班有25位学生,选修的情况如下: 选修1号课程的同学有: set1 = {‘张三’, ‘李四’, ‘王五’, ‘马六’, ‘赵七’, ‘钱八’} 选修2号课程的同学有: set2 = {‘姬一’, ‘孙必’, ‘周冲’, ‘王五’, ‘方向’, ‘张玉’} 选修3号课程的同学有:…

    2020年1月22日
    8.7K0
  • 上机四 数据库访问技术

    2学时 一、数据库编程案例:读取数据库信息并显示 数据库员工信息表字段如下: 使用JDBC连接数据库,读取employee表中信息并显示到页面。 mysql驱动下载:mysql-connector-java-5.1.41-bin.zip 注意事项:将驱动程序mysql-connector-java-5.1.6-bin,拷贝到Web应用程序的WEB-INF\l…

    2018年10月16日 编程开发
    7.5K0
  • 第一个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日 编程开发
    9500
  • plt.xlabel(‘产品名称’)报错‘str’object is not callable的解决方法

    运行居然报错了… 提示plt.xlabel(‘产品名称’)这一行有错误 报错信息 ‘str’object is not callable plt.xlabel(‘产品名称’)报错‘str’object is not callable的解决方法 重新运行x轴 描述信息终于出来了。 以防下次忘记,还是记录下来了。

    2022年8月13日
    6.0K0
  • input file获取文件路径时无法获取正确的路径

    页面有一个input file服务器控件,一个div,div是image标签的容器,当点击input file的值改变,我们往div里追加image标签;但当通过js的onchange事件动态获取input file 的路径的时候,发现console.log(path)打印出的路径是被浏览器屏蔽的, 例如:C:\fakepath\file.jpg 这是由于浏…

    2019年11月13日
    8.0K0
  • Java向mysql数据库插入datetime类型数据实例(精)

    在Mysql数据库中日期跟时间有两种: 1、date类型,date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期, 2、dateitme就是可以储存日期同时也可以储存时间。 datetime可以保存1000-01-01到 9999-12-31的日期。 上面mysql数据库中birthday字段类型设置的是datet…

    2018年5月2日
    17.1K0

发表回复

登录后才能评论