Servlet实现数字字母验证码图片(二):

生成验证码图片主要用到了一个BufferedImage类,如下:

aaarticlea/png;base64,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" alt="" />

使用登录的例子演示验证码的实现:

1、引入jquery-1.10.2.js文件,创建login.jsp,使用时间戳来刷新验证码

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<script type="text/javascript"
src="js/jquery-1.10.2.js"></script> <body>
<form method="post"
action="${pageContext.request.contextPath }/login.do">
用户名:<input type="text" name="username" /><br /> 密&nbsp;&nbsp;&nbsp;&nbsp;码:<input
type="text" name="password" /><br />
<!-- img中的src属性中,配置VerifyImage的请求 -->
验证码:<br />
<img id="imgObj" src="${pageContext.request.contextPath}/verifyCode.do" onclick="changeImg()"/> <input
type="text" name="verifyCode" /> <a href="javascript:void(0);" id="code"
onclick="changeImg()">看不清,换一张</a> <br /> <input type="checkbox"
value="1" name="rememberMe" />记住密码 <br /> <input type="submit"
value="登陆" />
</form>
</body>
<script type="text/javascript">
function changeImg() {
var imgSrc = $("#imgObj");
var src = imgSrc.attr("src");
//时间戳 ,为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳
var timestamp = (new Date()).valueOf();
src =src +"?timestamp=" + timestamp;;
imgSrc.attr("src", src);
}
</script>
</html>

2、创建登录成功和登录失败后的页面index.jsp和error.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户首页</title>
</head>
<body>
登录成功!
</body>
</html>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录失败</title>
</head>
<body>
登录失败...
</body>
</html>

3.创建画图servlet,VerifyImage.java

 package com.utils;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet("/verifyCode.do")
public class VerifyImage extends HttpServlet { // 产生随即的字体
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 24);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);
font[2] = new Font("Forte", Font.PLAIN, 24);
font[3] = new Font("Wide Latin", Font.PLAIN, 24);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);
return font[random.nextInt(5)];
} protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置响应头 Content-type类型
resp.setContentType("image/jpeg");
// 以下三句是用于设置页面不缓存
resp.setHeader("Pragma", "No-cache");
resp.setHeader("Cache-Control", "No-cache");
resp.setDateHeader("Expires", 0); OutputStream os = resp.getOutputStream();
int width = 83, height = 30; // 建立指定宽、高和BufferedImage对象
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 该画笔画在image上
Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场
g.fillRect(0, 0, width, height); char[] ch = "abcdefghigklmnopqrstuvwxyz"
.concat("ABCDEFGHIJKLMNOPQRSTUV").concat("WXYZ0123456789")
.toCharArray(); // 随即产生的字符串
// 不包括 i
// l(小写L)
// o(小写O)
// 1(数字1)0(数字0)
int length = ch.length; // 随即字符串的长度
String sRand = ""; // 保存随即产生的字符串
Random random = new Random();
for (int i = 0; i <; i++) {
// 设置字体
g.setFont(getFont());
// 随即生成0-9的数字
String rand = new Character(ch[random.nextInt(length)]).toString();
sRand += rand;
// 设置随机颜色
g.setColor(new Color(random.nextInt(255), random.nextInt(255),
random.nextInt(255)));
g.drawString(rand, 20 * i + 6, 25);
}
// 产生随即干扰点
for (int i = 0; i < 40; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
g.drawOval(x1, y1, 2, 2);
}
g.setColor(c); // 将画笔的颜色再设置回去
g.dispose(); // 将验证码记录到session
req.getSession().setAttribute("safecode", sRand);
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
} protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
} }

4.创建登录验证处理servlet,LoginServlet.java

 package com.utils;

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; @WebServlet("/login.do")
public class LoginServlet extends HttpServlet { Logger log = Logger.getLogger(LoginServlet.class); @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
log.debug("开始执行doGet方法");
this.doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
log.debug("开始执行doPost方法"); req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8"); log.debug("开始接收参数");
String username = req.getParameter("username");
String password = req.getParameter("password");
String safeCode = req.getParameter("verifyCode"); log.debug("接收到参数:username =" + username + ";password=" + password
+ ";safecode=" + safeCode); // 获取验证码
String sc = (String) req.getSession().getAttribute("safecode");
log.warn("服务器中的验证码:" + sc);
// 忽略大小写处理:
if (!sc.equalsIgnoreCase(safeCode)) {
log.warn("验证码输入有误!");
resp.sendRedirect("login.jsp");
return;
} String isRe = req.getParameter("rememberMe");
log.debug("是否记住密码:" + isRe);
if ("1".equals(isRe)) {
/*
* 记住密码 在客户端的Cookie中,写入一个字符串标识
*/
// 创建cookie
log.debug("创建Cookie");
Cookie cookie = new Cookie("rememberMe", username);
// 将cookie绑定到响应中
log.debug("绑定Cookie到响应中");
resp.addCookie(cookie);
} if ("admin".equals(username) && "admin".equals(password)) {
log.debug("登录成功,跳转到Index.jsp页面");
req.getSession().setAttribute("loginuser", username);
resp.sendRedirect("index.jsp");
} else {
log.debug("登录失败,跳转到error.jsp页面");
resp.sendRedirect("error.jsp");
} } }

5、结果

参考链接:https://blog.csdn.net/sinat_39955521/article/details/78922814

一次性验证码:

目的:一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。

原理:

1,服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。

2,密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。

 参考链接:http://baijiahao.baidu.com/s?id=1552594243817616&wfr=spider&for=pc

项目下载:下载工程

Servlet实现数字字母验证码图片(二)的更多相关文章

  1. 验证码图片二值化问题 BitmapData 怎么解决

    对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...

  2. Java实现Web页面前数字字母验证码实现

    最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式. 页面JS代码:触发变动验证码改变的JS 后台 ...

  3. Servlet实现验证码图片(一)

    Servlet实现数字字母验证码图片(一): 生成验证码图片主要用到了一个BufferedImage类,如下:

  4. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  5. JavaWeb---总结(九)通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片  1 package gacl. ...

  6. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  7. java web 学习九(通过servlet生成验证码图片)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. 通过Servlet生成验证码图片

    原文出自:http://www.cnblogs.com/xdp-gacl/p/3798190.html 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类, ...

  9. javaWeb学习总结(3)- 通过Servlet生成验证码图片(2)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

随机推荐

  1. Restful Api CRUD 标准示例 (Swagger2+validator)

    为什么要写这篇贴? 要写一个最简单的CRUD 符合 Restful Api    规范的  一个Controller, 想百度搜索一下 直接复制拷贝 简单修改一下 方法内代码. 然而, 搜索结果让我无 ...

  2. Vim练级攻略(转)

    转自平凡的世界:http://www.ccvita.com/ 前言今天看到这篇文章,共鸣点非常多.它把Vim使用分为4个级别,目前我自己是熟练运用前面三级的命令,在培养习惯使用第四级.完全就是我这一年 ...

  3. PMP第一章:引论

    项目是为创造独特的产品,服务或成果而进行的临时性的工作. 项目的临时性是指项目有明确的起点和终点. 项目旨在推动组织从一个状态(当前状态)转到另一个状态(将来状态),从而达成特定目标. 项目管理就是将 ...

  4. RK61 Keyboard Use

    ~ 打法: FN+shift+Esc / ? Alt Files Ctral   <=> 上 下 左 右 打法:FN+shift 切换 解锁键盘 打法:FN+win 蓝牙连接 打法:FN+ ...

  5. 关于localStorage

    localStorage 是 HTML5 本地存储的 API,使用键值对的方式进行存取数据,存取的数据只能是字符串.不同浏览器对该 API 支持情况有所差异,如使用方法.最大存储空间等. 使用方法 设 ...

  6. 个人待办事项工具的设计和搭建(IFE前端2015春季 任务3)

    这是我几个月之前的项目作品,花了相当的时间去完善.博客人气不高,但拿代码的人不少,所以一直处于保密状态.没有公开代码.但如果对你有帮助,并能提出指导意见的,我将十分感谢. IFE前端2015春季 任务 ...

  7. 为什么U盘在拔出之前需要“安全弹出”?

    前言 我们不知道从什么时候开始有一个观念:U盘一定要点击“安全弹出”才能拔.那么是不是在任何情况下都必须要这样呢? 介绍 U盘的传输策略有两种: 写入缓存:这种策略在windows中称为“更好的性能” ...

  8. flask学习(十一):if判断语句

    1. 语法: {% if xxx %} {% else %} {% endif %} 2. if的使用,和python中if相差无几 用if判断,当用户名存在且年龄大于18时,才显示用户名和注销

  9. 21.线程池ThreadPoolExecutor实现原理

    1. 为什么要使用线程池 在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题.因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处: 降低资源消耗 ...

  10. 【Windows】Python脚本随机启动

    Python脚本的管理在linux系统上市非常方便的,在windows则不是很方面.但是由于之前对于Windows这块的内容不是很了解,其实计划任务也是不错的,但和linux相比起来还是欠缺了那么点. ...