Jsp制作验证码
验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
Jsp制作验证码
运行环境:tomcat+eclipse+jdk
基本思想:现在Servlet上画出验证码的图片,让其显示到页面上,再用js方法能刷新验证码,可以用ajax得到用户输入的值经过servlet跟验证码比对判断是否,并符合提示用户
基本方法:
- BufferedImage:
Image是一个抽象列,BufferedImage是Image的实现。
Image和BufferedImage的主要作用就是将一副图片加载到内存中。
Java将一副图片加载到内存中的方法是:
Java代码
String imgPath = "d:/demo.jpg";
BufferedImage image = ImageIO.read(new FileInputStream(imgPath));
该方法可以获得图片的详细信息,例如:获得图片的宽度:image.getWidth(null);图片只有加载内存中才能对图片进行进一步的处理。
- Graphics:
- Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等,具体操作其内容我推荐可以看看使用Java的Graphics类进行绘图的方法详解
验证码的代码实现
我这里做的验证码是显示中文的,可以在servlet中修改想要显示的是数字还是字母还是结合的,可以用数组存放这些,也可以转换ASCII码经行随机数字,看个人喜好
先是做一个jsp中的验证码的地方
<div class="row cl">
<div>
<input type="text" placeholder="验证码" value="验证码:" onblur="testCheck(this.value);">
<img id="pic" src="CheckTestServlet"> <a id="kanbuq" onClick="Checktest();">看不清,换一张</a> </div>
</div>
在做一个Servlet叫做CheckTestServlet.java
@WebServlet("/CheckTestServlet")
public class CheckTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这个方法实现验证码的生成
response.setCharacterEncoding("utf-8");
//创建图片缓冲区设置其大小 BufferedImage(int width, int height, int imageType)
BufferedImage bImage=new BufferedImage(100, 30, BufferedImage.TYPE_3BYTE_BGR);
//在缓冲区上创建画布
Graphics g=bImage.getGraphics();
//设置背景颜色
g.setColor(Color.orange);
//创建画布矩形,位置(0,0)点,大小100,30
g.fillRect(0, 0, 100, 30);
//创建随机对象
Random r=new Random();
int index;//存放随机数
//得到的文字东西存放处
StringBuffer sBuffer=new StringBuffer();
//循环产生四个字
for (int i = 0; i < 4; i++) {
//中文字的第一个十六进制码为4e00转十进制是19968,最后一个是9fa0十进制为40869,所以可以产生在此之间的随机数
index=r.nextInt(40869-19968+1)+19968;//产生随机数字
//设置随机颜色,
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//设置文字的类型,大小
g.setFont(new Font("", Font.BOLD, 20));
/*画字,将随机数字转换成十六进制Integer.toHexString(index),16)再转换字符(char)(Integer.parseInt,
在设置每个文字的位置
*/
g.drawString((char)(Integer.parseInt(Integer.toHexString(index),16))+"", i*22+4, 18);
//将其存放在StringBuffer中,以便后面读取作比较
sBuffer.append((char)(Integer.parseInt(Integer.toHexString(index),16)));
}
//将得到的文字设置到session中
request.getSession().setAttribute("piccode", sBuffer.toString());
/*将这个验证码图片读写到页面中
* write(RenderedImage im, String formatName, OutputStream output)
*/
ImageIO.write(bImage, "jpg", response.getOutputStream());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
在做一个js刷新验证码的,用于看不清,或者别的刷新用处
function Checktest(){
var time=new Date().getTime();
$("#pic").attr('src',"CheckTestServlet?d="+time)
}
再写一个Ajax去验证用户输入的是否正确返回提示,这是用jQuery做的,需要引js
function testCheck(num){
$.ajax({
type:"post",//提交方式
url:"TestCheckServlet",//提交地址
async:true,//是否异步请求
dataType:"html",//返回类型
data:{"num":num},//传过去的值
success:function(data,textStatus){//成功执行的方法
$("#checks").html(data)
},
error:function(){//失败执行的方法
alert("error");
}
})
}
有点麻烦的再去做一个Servlet去验证Ajax传过来的值是否匹配验证码
@WebServlet("/TestCheckServlet")
public class TestCheckServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
//得到输入的验证码与随机的图片验证码作比较,判断是否相等,返回提示用户,
if (request.getSession().getAttribute("piccode").toString().equals(request.getParameter("num"))) {
out.println("验证码正确");
}else {
out.println("验证码错误");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
就这样验证码已经基本搞定,其中还有许多需要修改的内容,花样,根据需求而来
【版本声明】 转载请注释出处
Jsp制作验证码的更多相关文章
- (一)学习MVC之制作验证码
制作验证码的方法在@洞庭夕照 看到的,原文链接:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html 现自己利用该方法制作一个简单的 ...
- 使用jsp生成验证码
在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 此演示程序包括三个文件: 1.index.jsp:登录页面 2.image.jsp:生成 ...
- JSP制作简单登陆
JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文 ...
- php 制作验证码不显示的问题
php制作验证码的代码,这里就不多说了,网上有很多的,这里说一些可能遇到的问题. 1. 首先是检查自己的php.ini文件,是否支持gd库. 2.保证代码没有出问题. 3.检查字体文件路径是否正确. ...
- 利用Java EE里jsp制作登录界面
jsp连接数据库.百度经验. 1.在新建的Project中右键新建Floder 2.创建名为lib的包 3.创建完毕之后的工程目录 4.接下来解压你下载的mysql的jar包,拷贝其中的.jar文件 ...
- java制作验证码
建立一个web工程
- jsp页面验证码(完整实例)
项目结构如下,MyEclipse中新建一个Web Project,取名servlet 1.src下new一个servlet类 package com.servlet; import java.awt. ...
- java制作验证码(java验证码小程序)
手动制作java的验证码 Web应用验证码的组成: (1)输入框 (2)显示验证码的图片 验证码的制作流程: 生成验证码的容器使用 j2ee的servlet 生成图片需要的类: (1) Buffere ...
- 使用python制作验证码
方法一 简单型:使用random模块制作一个随机字母与数字的验证码 import random def make_code(n): res='' for i in range(n): num=str( ...
随机推荐
- Hibernate框架学习之注解配置关系映射
上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下: 单向的一 ...
- MySQL plugin结构
1.背景 MySQL插件安装语法如下: 13.7.3.3 INSTALL PLUGIN Syntax INSTALL PLUGIN plugin_name SONAME 'shared_library ...
- Javascript日期类型的妙用
http://heeroluo.net/Article/Detail/110 获取某个月份的天数 相信大家读小学的时候就知道一年十二个月各有多少天了,这里面有个特殊的存在——2月.闰年的2月有29天, ...
- 照虎画猫写自己的Spring——依赖注入
前言 上篇<照虎画猫写自己的Spring>从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F ...
- Redis 快速入门
Redis 快速入门 谈到Redis,大家应该都不陌生.它是用c语言开发的一个高性能键值数据库,主要用于缓存领域.本章通过Redis的安装,Redis的五大数据类型,Redis的Java客户端,Red ...
- angular2.x指令
1.指令 *ngIf: 判断 isActive 为true时 <user-detail> 生效展示 <user-detail *ngIf="isActive"&g ...
- SaltStack 架构自动部署 03
架构图 模块化部署 系统模块:系统优化,内核参数,网络参数 功能模块:如:nginx,tomcat, 业务模块: 1.在salt-master端修改配置文件 [root@01 salt]# vim / ...
- 51Nod 1108 距离之和最小 V2 1096 距离之和最小 中位数性质
1108 距离之和最小 V2基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小 ...
- 关于mui header在手机上运行丢失问题
并不需要换header, 只需要把引用的例子自带的CSS文件 app.css.里的两个样式:.mui-plus.mui-android header.mui-bar {display: none;}. ...
- Linux基础-最基础
Linux基础 为了更好的学习知识,开通此博客,以前博客丢了...记录一下知识点,希望能在这里与大家互相学习交流. 20171113 14:00 Linux基础-基本知识 Linux树状文件系统结构 ...