Servlet实现数字字母验证码图片(二)
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 /> 密 码:<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实现数字字母验证码图片(二)的更多相关文章
- 验证码图片二值化问题 BitmapData 怎么解决
对不起,这算是一篇求助啦,先上图,防止不清楚,放大了一点,下面是图片,上面是没有二值化的,下面是二值化之后的,我其实不懂什么是二值化啦,就是一定范围变黑,变白 问题: 为什么我的结果上面还是有很多彩色 ...
- Java实现Web页面前数字字母验证码实现
最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来, 前段页面实现代码: 为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式. 页面JS代码:触发变动验证码改变的JS 后台 ...
- Servlet实现验证码图片(一)
Servlet实现数字字母验证码图片(一): 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- JavaWeb---总结(九)通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl. ...
- javaweb学习总结(九)—— 通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web 学习九(通过servlet生成验证码图片)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- 通过Servlet生成验证码图片
原文出自:http://www.cnblogs.com/xdp-gacl/p/3798190.html 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类, ...
- javaWeb学习总结(3)- 通过Servlet生成验证码图片(2)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
随机推荐
- base64 原理
Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32.Base16编码.标准Base64编码使用的64个字符为: 这64个字符是各种字符编码(比如AS ...
- [spring]Bean注入——在XML中配置
Bean注入的方式有两种: 一.在XML中配置 属性注入 构造函数注入 工厂方法注入 二.使用注解的方式注入@Autowired,@Resource,@Required 本文首先讲解在XML中配置的注 ...
- Runtime.getRuntime.exec();
杀死Chrome浏览器进程 private static void closeAllChrome() throws IOException{ Runtime.getRuntime().exec(&qu ...
- SQL 2008R2还原对于服务器失败 备份集中的数据库与现有数据库 3154错误
以前用sql server 2005的时候就遇到过类似的问题,数据库在别的服务器上备份后,在本机无法还原,这次终于找到了解决方案,网上的没有找到类似的,希望能帮到大家! 原因分析:在SQL Serve ...
- 虚拟机VMware搭建代码环境
安装git yum install git -y 安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/ins ...
- nyoj——113 getline
字符串替换 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入 ...
- nyoj20——有向无环图深搜模板
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...
- zk的watcher机制的实现
转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-zookeeper-watcher/ http://blog.csdn ...
- IE中的if语句--实现不同版本IE浏览器不同html代码 (转)
在很多html代码中常常可以看到很多的IE的条件语句,有时候很不明白他们的意思,其实这是为了能与低版本浏览器实现更好的兼容,例如在制作纯CSS的级联菜单时,由于在IE6中只有<a>支持伪类 ...
- Java 进阶7 并行优化 JDK多任务执行框架技术
Java 进阶7 并行优化 JDK多任务执行框架技术 20131114 Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...