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 实战-逢7 过游戏的实现

    不知道你有没有玩过“逢 7 过”的游戏,游戏规则很简单: 几个人轮流报数,凡遇到 7 的倍数,或含 7 的数字就要跳过,否则就算失败。 今天我们就用 Python 来打印 1 到 100 之间,所有满足条件的数字。 知识点 Python 开发环境 int 类型 变量 运算符 while 循环 条件判断 💡提示: 开发中,我们经常要先构思框架,…

    2022年2月2日
    8.4K0
  • 分享一个非常实用的连接数据库javabean

    连接mysql数据库的javabean,修改url数据库连接字符串和驱动程序加载代码,即可成为通用的数据库连接BEAN。 package com.common; import java.sql.*; public class DataBaseConn { public  Connection conn = null; public void createCo…

    2020年12月6日
    6.2K0
  • HTTP错误 403.14 服务器配置为不列出此目录内容

    开发一个企业网站,使用ASP技术,在本地通过IIS管理器调试,出现 如下问题: HTTP 错误 403.14 – Forbidden Web 服务器被配置为不列出此目录的内容 解决方法: 在”功能视图“,中找到”目录浏览“,双击进入 在目录浏览右侧操作中选择”启用“! 这时再浏览网站,可以看到已经不报错了,但是网站是以文件目录的形式展现的! 这是…

    2018年7月3日 编程开发
    4.9K0
  • 10秒倒计时、考试结束倒计时功能实现代码-JS

    注册成功或登录后网页会有倒计时,如5秒后跳转到哪个页面的功能。 在做一些在线测试,网上考试系统时,会用到倒计时功能。 如网上考试系统里,会有时间提示离考试结束还有多长时间,临近考试结束剩10分钟,还可以弹窗提示考生。 JavaScript实现倒计时功能代码 <!DOCTYPE html> <html> <head> &lt…

    2020年11月1日
    4.1K0
  • 上机三 Java Web应用程序设计

    建议学时:8 2学时 一、编写JSP页面date.jsp,格式化显示系统当前时间 需要使用Date类和SimpleDateFormat类。 在头部引入。 <%@ page import=”java.util.Date”%> <%@ page import=”java.text.SimpleDateFormat”%> SimpleDat…

    2018年9月11日
    20.0K1
  • 第四章 数据库应用开发案例1

    理解JDBC以及Java程序与数据库的交互原理
    掌握JDBC API中提供的常用接口和类
    掌握JDBC连接数据库方法
    掌握数据库的CRUD操作
    掌握数据源与连接池技术

    2018年2月7日
    7.3K2

发表回复

登录后才能评论