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

  • JSP一次上传多个文件(基于jspSmartUpload)

    支持中文的jsp文件上传组件:jspSmartUpload.jar下载 可以一次上传多个文件 upload.html <html> <head> <title>网页设计:文件上传</title> <meta http-equiv=”Content-Type” content=”text/html; cha…

    编程开发 2021年11月25日
    2.5K0
  • 9个要点让你成为优秀的Java程序员

    文章介绍了要成为优秀Java程序员的9个要点,掌握了这些要点,会让你在众多Java开发人员中脱颖而出。

    2022年12月1日
    1.5K0
  • 最清楚的过拟合(Overfitting)、欠拟合讲解

    问题的产生 当我们构建模型时,总会希望假设空间参数尽可能多,系统越复杂,拟合得越好嘛!我们还希望我们的优化算法能使我们的模型产生的损失函数的值尽可能小(即我们的假设空间能够贴合每一个训练样本点)。但这样真的好吗?奥卡姆剃刀貌似又胜利了。然而假设我们的模型达成了上述的情况,有很大概率产生一个ML界非常令人头疼的一件事:过拟合(Overfitting)。 欠拟合…

    2022年9月21日
    9.9K0
  • dao service view pojo utils tools都放什么? jsp的(MVC)三层架构入门

    java的(MVC)三层架构(dao、service、view) Java EE典型架构,分层的目的:高内聚,低耦合。 一般java都是三层架构   (还可加一个:工具类:util比如处理多语言功能,网站非法信息过滤等等功能的代码集); 三层架构体系,是逻辑上的三层,按照完成功能不同,所做事宜不同,将项目分为三个层次 1:数据访问层(dao) 2:业务逻辑层…

    2020年10月24日
    11.5K0
  • 第3课:C语言程序的构成和书写规则

    先来看一个C语言程序:输入两个正整数,计算并输出两数的和。 程序代码: /*ex1_2.c:求两个正整数的和*/ #include <stdio.h> void main()                         /*主函数*/ {     int a,b,sum;                    /*定义三个整型变量*/    …

    2020年4月5日
    10.9K0
  • Python数据分析入门实战一:统计分析用户学习数据

    Python数据分析要求: 使用 Python 基础知识分析用户学习数据 json 文件,并从文件中统计出中指定的数据项。 用户学习数据 json 文件下载: http://labfile.oss.aliyuncs.com/courses/764/user_study.json user_study.json 文件部分内容展示如下: {“minutes”: …

    2022年2月5日
    10.9K0

发表回复

登录后才能评论