Jsp+servlet 验证码案例
昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证。顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类。以供大家做个參考。
1:加入VeriyCodeUtils类生成验证码图像
package com.servlet; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Random; import javax.imageio.ImageIO; /**
*
* @author hubiao
* 验证码生成器
* 用到API
* BufferedImage 创建一个图像
* Graphics2D 绘制
* fillRect(x,y,width,height);背景
* font()字体
* drawRect();边框
* drawLine();线
* drwaString:图像数据
* ImageIO 生成图像
*/
public class VeriyCodeUtils {
/**
* @param output 保存验证图像的流
* @return 验证码
*/
public static String newVeriyCode(OutputStream output)
{
int width = 90;
int height = 40;
int codeCount = 5;
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' }; //创建图像对象,8位RGB
BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //通过Crapahices来绘制图像到BufferedImage中
Graphics2D gra = buffered.createGraphics(); //设置图片背景:白色
gra.setColor(Color.WHITE);
gra.fillRect(0, 0, width, height); //设置字体,字体大小依据图片高度决定
gra.setFont(new Font("Fixedsys",Font.PLAIN,height-2)); //设置边框:黑色,1cm
gra.setColor(Color.BLACK);
gra.drawRect(0, 0, width-1, height-1); //生成10条黑色干扰线
gra.setColor(Color.BLACK);
Random ran = new Random();
for(int i = 0; i < 70;i++)
{
int x = ran.nextInt(255);
int y = ran.nextInt(255);
int x1 = ran.nextInt(255);
int y1 = ran.nextInt(255);
gra.drawLine(x, y,x+x1, y+y1);//画直线
}
//生成验证码
StringBuffer sb = new StringBuffer();
int r = 0,g = 0,b = 0;
for(int i = 0; i < codeCount; i++)
{
String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
//对每位验证码都生成不同的颜色。添加识别系统难度
r = ran.nextInt(255);
g = ran.nextInt(255);
b = ran.nextInt(255);
gra.setColor(new Color(r, g, b));
gra.drawString(strRand, (i+1)*13, height-4);
sb.append(strRand);
}
try {
ImageIO.write(buffered, "jpeg", output);
} catch (Exception e) {
throw new RuntimeException(e);
} return sb.toString();
}
}
2:servlet使用验证码
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//禁止图像缓存
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
resp.setContentType("image/jpeg"); //生成验证码图像
String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream()); //将验证码保存到session中
HttpSession session = req.getSession();
session.setAttribute("validateCode", veriyCode);
}
3:JSP页面使用验证码
</head>
<script type="text/javascript">
function createCode()
{
var t = new Date().getTime();//防止页面缓存。使用时间搓
var srcImg = document.getElementById("srcImg");
srcImg.src="/ImgVeifyWeb/vity.do?"+t;
}
</script>
<body>
<h1>${requestScope.code}</h1>
<img id="srcImg" src="<c:url value="/vity.do"></c:url>" /> #这里使用直接让img訪问servlet,通过response响应一个图像流
<a href="##" id="codeId" onclick="createCode()">换一张</a>
<form action="<c:url value="/hello.do"></c:url>" method="post">
<input type="text" name="codeVify"/>
<input type="submit" value="提交"/>
</form>
</body>
3:校验验证码
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
Object validateCode = session.getAttribute("validateCode");
System.out.println(validateCode); String codeVify = req.getParameter("codeVify");
if(codeVify==null || codeVify.equals(""))
{
req.setAttribute("code","验证证不能为空");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
return;
}else if(!validateCode.toString().equalsIgnoreCase(codeVify))
{
req.setAttribute("code","验证证错误");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
return;
}
System.out.println("以下開始 做其它业务操作....");
}
校验图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHViaWFvXzA2MTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Jsp+servlet 验证码案例的更多相关文章
- Java Web项目案例之---登录注册和增删改查(jsp+servlet)
登录注册和增删改查(jsp+servlet) (一)功能介绍 1.用户输入正确的密码进行登录 2.新用户可以进行注册 3.登录后显示学生的信息表 4.可以添加学生 5.可以修改学生已有信息 6.可以删 ...
- Java基于springMVC的验证码案例
``` Java验证码案例(基于springMVC方式) 验证码工具类 package com.ekyb.common.util; import java.awt.Color; import java ...
- JSP/Servlet(一)
JSP/Servlet(一) Web应用和web.xml文件: 一.构建Web应用: 1.在任意目录下创建一个文件夹. 2.在第1步所建的文件夹内建一个WEB-INF文件夹(注意大小写). 3.进 ...
- Jsp制作验证码
验证码 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart&qu ...
- 使用JSP+Servlet+Jdbc+Echatrs实现对豆瓣电影Top250的展示
使用JSP+Servlet+Jdbc+Echatrs实现对豆瓣电影Top250的展示 写在前面: 有的小伙伴,会吐槽啦,你这个标题有点长的啊.哈哈 ,好像是的!不过,这个也是本次案例中使用到的关键技术 ...
- javaweb练手项目jsp+servlet简易购物车系统
简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...
- 基于jsp+servlet图书管理系统之后台万能模板
前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...
- JS.中文乱码,Jsp\Servlet端的解决办法
JS.中文乱码,Jsp\Servlet端的解决办法 2010-03-08 15:18:21| 分类: Extjs | 标签:encodeuricomponent 乱码 urldecoder ...
- 最简单的jsp+servlet的增删改查代码
package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
随机推荐
- InChatter系统之服务客户端的开发
今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流.开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按 ...
- vue HTTP请求(针对vue-resource)
//初始化页面需要做什么事情 //点击后需要做什么事情 //鼠标.键盘.冒泡.默认行为等事件 //前端调用接口就是按需展示数据//created和mounted里面都可以做数据处理,唯一不同的是cre ...
- 洛谷 P1364 医院设置
题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l.如上 ...
- iTOP-4418开发板最新资料及例程
开发板资料: 开发板硬件资源: 1.POWER电源接口 电源输入为 5V/2A+,给核心板 AXP228 电源管理芯片提供 5V 电源. 2.SWITCH电源开关 轻触电源开关可以控制开发板电源通断. ...
- OpenFlow_tutorial_4_Create_a_Learning_Switch
一.环境搭建: 教程里提供的VM image需要梯子才能下载,好不容易下载下来,发现镜像很难用,各种安装问题,搞了好几天也解决不了.后来就自己搭环境,主要是安装Ryu. 1.首先下载相应的python ...
- blockdev - 从命令行调用区块设备控制程序
总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...
- CAD使用GetxDataDouble读数据(com接口)
主要用到函数说明: MxDrawEntity::GetxDataDouble2 读取一个Double扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, re ...
- note for git
1.download https://git-for-windows.github.io/ 2.command add file to git: git add filename & git ...
- [GXOI/GZOI2019]宝牌一大堆(dp)
luogu bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...
- VIM命令大全(图+文)
在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...