Java Web(四) 一次性验证码的代码实现
其实实现代码的逻辑非常简单,真的超级超级简单。
1、在登录页面上login.jsp将验证码图片使用标签<img src="xxx">将绘制验证码图片的url给它
2、在服务器端就两个servlet,一个就是用来绘制验证码图片的VerifyCodeServlet,另一个就是登录时验证验证码是否点写正确或是否重复提交的LoginServlet
3、在VerifyCodeServlet中,将验证码的四个字母存入session中,然后在LoginServlet中,将请求中提交过来的验证码与session中的进行对比,如果正确,则验证成功,并且将session中的验证码删除,为什么要删除?保证session中的数据只能被用一次,防止重复提交数据,如果不正确,就使用request,将错误信息保存,然后请求转发到登录页面显示错误信息,如果发现session中的数据为null,说明重复提交了数据,也将错误信息用同样的方法返回到登录页面。
难点就在于:VerifyCodeServlet的代码实现.对绘图的代码不是很熟悉。
login.jsp
<body>
<%
String msg = (String)request.getAttribute("msg");
if(msg != null){
out.print(msg);
}
%> <form action="/test01/LoginServlet" method="post">
用户名:<input type="text" name="username" /> <br/>
验证码:<input type="text" name="verifyCode" size="5" /> <img src="/test01/VerifyCodeServlet" /> <br/>
<input type="submit" value="提交"/>
</form>
</body>
VerifyCodeServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //声明验证码
int width = 60;
int height = 30;
String data = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz"; //随机字符字典,其中0,o,1,I 等难辨别的字符最好不要
Random random = new Random();//随机类
//1 创建图片数据缓存区域(核心类)
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个彩色的图片
//2 获得画板(图片,ps图层),绘画对象。
Graphics g = image.getGraphics();
//3 选择颜色,画矩形3,4步是画一个有内外边框的效果
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
//4白色矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2); /**1 提供缓存区域,为了存放4个随机字符,以便存入session */
StringBuilder builder = new StringBuilder(); //5 随机生成4个字符
//设置字体颜色
g.setFont(new Font("宋体", Font.BOLD&Font.ITALIC, 20));
for(int i = 0 ; i < 4 ;i ++){
//随机颜色
g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255))); //随机字符
int index = random.nextInt(data.length());
String str = data.substring(index, index + 1); /**2 缓存*/
builder.append(str); //写入
g.drawString(str, (width / 6) * (i + 1) , 20);
}
//给图中绘制噪音点,让图片不那么好辨别
for(int j=0,n=random.nextInt(100);j<n;j++){
g.setColor(Color.RED);
g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//随机噪音点
} /**3 获得随机数据,并保存session*/
String tempStr = builder.toString();
request.getSession().setAttribute("sessionCacheData",tempStr); //.. 生成图片发送到浏览器 --相当于下载
ImageIO.write(image, "jpg", response.getOutputStream());
}
LoginServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1 获得用户输入的验证码
String verifyCode = request.getParameter("verifyCode");
//2 获得服务器session 存放数据 ,如果没有返回null
String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");
// *将服务器缓存session数据移除
request.getSession().removeAttribute("sessionCacheData");
// ** 判断服务器是否存在
if(sessionCacheData == null){
request.setAttribute("msg", "请不要重复提交");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//3 比较
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用户输入错误
// * 存放request作用域
request.setAttribute("msg", "验证码输入错误");
// * 请求转发
request.getRequestDispatcher("/login.jsp").forward(request, response); return;
} //...... 登录操作 } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
效果图:

验证码错误时:

注意:
如果要拷贝代码的话,需要改就应该就是那几处url,你的肯定跟我的不一样,并且有些人设置的servlet的访问路径也不一样,所以拷贝的话只需要拷贝关键代码即可。
Java Web(四) 一次性验证码的代码实现的更多相关文章
- web开发(四) 一次性验证码的代码实现
在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6426072.html>,在此仅供学习参考之用. 其实实现 ...
- java web(四)文件上传与下载
一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...
- Java的四种内部类(含代码实例)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- java Web 启动时自动执行代码的几种方式
Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...
- java web(四):request、response一些用法和文件的上传和下载
上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...
- java web,生成验证码图片的技术
偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...
- 与阿根廷一起学习Java Web四个发展:对于信息传输和信息传输
发送短信和通用身份验证和用户注册系统消息提示功能模块,但是实现代码过于复杂.使用JSPGen后,深深发送消息.SMS程序包使复杂的简单非常活跃. 在短信模块:支持两种模式,它们被发送到第三方.地方平台 ...
- Java Web(四) 过滤器Filter
Filter概述 Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改.Filter提出了过滤链的概念.一个FilterChain包括多个Filter. ...
- Java Web项目中的经典代码抽取
前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内 ...
随机推荐
- 2018.10.23 hdu2476String painter(区间dp)
传送门 一道挺妙的区间dp. 我们先用区间dp求出第一个串为空串时的最小代价. 然后再加入原本的字符更新答案就行了. 代码: #include<bits/stdc++.h> using n ...
- 类型转化&WCF不同binding的区别
需要使用队列时并且涉及多线程时使用ConcurrentQueue 这个性内比自己使用Queue并且配合lock要好很多 calcFactory = new ChannelFactory<ICal ...
- illustrator画梯形
1.在空白文档上先绘制出一个长方形: 2.用鼠标点击工具箱中”自由变换“工具: 3.用鼠标指向长方形四个顶点中的任意一个,当鼠标的箭头变为相反反方向的双箭头时,再按住鼠标左键不要松手, 同时按住[sh ...
- 如何制作一个自适应手机、电脑、ipad的网页方法总结
进入2015年,手机上网的用户已经越来越多,已经赶超PC端.随着2G.3G.4G.免费WIFI和无线基站的不断普及,越来越多的人开始使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端. ...
- Jersey RESTful WebService框架学习(二)使用@PathParam
@PathParamuri路径参数写在方法的参数中,获得请求路径参数.比如:@PathParam("username") String userName 前端请求: <!DO ...
- 使用 alt_disk_copy 克隆 rootvg
地址:http://www.ibm.com/developerworks/cn/aix/library/au-alt_disk_copy/ 简介 大多数系统管理员都遇到过以下情况: 一次 ML 升级失 ...
- (转)C# 中使用分布式缓存系统Memcached
转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...
- webservice之helloword(web)rs
spring整合webservice 1.pom.xml文件 <dependencies> <!-- cxf 进行rs开发 必须导入 --> <dependency> ...
- c简单的单向链表
ps:list链表 node节点 在链表中节点就是一个个的结构体 堆空间由于在申请内存时,地址是随机的,所以要用链表的方式将其连接起来,但是链表头的地址要知道. 每个节点包含两个部分:数据区和地址区 ...
- 项目管理系统Redmine(v1.1.2)安装手记
一.环境 1.硬件 普通PC. 2.软件 Windows 2003操作系统. 二.下载必要的软件 1.Ruby 1.8.x Redmine是基于Ruby On Rails的软件,所以首 ...