其实实现代码的逻辑非常简单,真的超级超级简单。

     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(四) 一次性验证码的代码实现的更多相关文章

  1. web开发(四) 一次性验证码的代码实现

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6426072.html>,在此仅供学习参考之用. 其实实现 ...

  2. java web(四)文件上传与下载

     一.文件上传原理 1.在TCP/IP中,最早出现的文件上传机制是FTP ,它是将文件由客户端发送到服务器的标准机制:但是在jsp使用过程中不能使用FTP方法上传文件,这是由jsp运行机制所决定. 通 ...

  3. Java的四种内部类(含代码实例)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. java Web 启动时自动执行代码的几种方式

    Web容器启动后执行代码的几种方式,其执行顺序为:4===>5===>1===>2===>3,即指定init-method的Bean开始执行,接着实现spring的Bean后置 ...

  5. java web(四):request、response一些用法和文件的上传和下载

    上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...

  6. java web,生成验证码图片的技术

    偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...

  7. 与阿根廷一起学习Java Web四个发展:对于信息传输和信息传输

    发送短信和通用身份验证和用户注册系统消息提示功能模块,但是实现代码过于复杂.使用JSPGen后,深深发送消息.SMS程序包使复杂的简单非常活跃. 在短信模块:支持两种模式,它们被发送到第三方.地方平台 ...

  8. Java Web(四) 过滤器Filter

    Filter概述 Filter意为滤镜或者过滤器,用于在Servlet之外对request或者response进行修改.Filter提出了过滤链的概念.一个FilterChain包括多个Filter. ...

  9. Java Web项目中的经典代码抽取

    前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内 ...

随机推荐

  1. Rest架构风格

    一.REST介绍:: 1.REST是英文 Representational State Transfer的缩写 -- 表象化状态转变 或者 表述性状态转移 1.1 REST是 Web服务的一种架构风格 ...

  2. R入门(二)-对象以及它们的模式和属性

    对象以及它们的模式和属性 R操作的实体在技术上说是对象.R的对象类型包括数值型,复数型,逻辑型,字符型和原味型. “原子”型对象:对象的元素都是一样的类型或模式,如逻辑向量和字符串向量. 列表对象:列 ...

  3. Win7 qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库问题 网上搜了下可以简单粗暴的用 D:\Qt\Qt5.6.0\5.6\msvc2015\bin ...

  4. 删除一直处于deleting状态的数据卷

    一.场景 有一个volume数据卷hzb-1G-xxxxxx创建在nc8的ceph节点上,并且该数据卷的但是有一天nc8节点坏掉了.当我们删除hzb-1G-xxxxxx的时候,就会一直处于deleti ...

  5. C++之输出100-200内的素数

    素数(质数)    除了1和它本身以外不再被其他的除数整除. // 输出100--200内的素数 #include<iostream> using namespace std; int m ...

  6. BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)

    4129: Haruna’s Breakfast Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 835  Solved: 409[Submit][St ...

  7. Java8函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等

    一:函数式接口 1.函数式接口的概念就是此接口必须有且只能有一个抽象方法,可以通过@FunctionalInterface来显示规定(类似@Override),但是没有此注解的但是只有一个抽象方法的接 ...

  8. Typecho 二次开发文档链接

    快速入门模板入门 模板制作快速入门推荐目录结构 Typecho模板的推荐页面构成模板文件说明 Typecho主题制作文件结构 页面制作制作functions文件: Typecho的functions. ...

  9. Linux下VNC配置使用总结:开启+桌面配置+安全访问

    操作环境:CentOS 5.3 + Windows XP SP3 32bit + RealVNC 4.1.2 i386 + TigerVNC. 参考:潇湘隐者-Linux系统VNC配置实践总结,萨米的 ...

  10. share pool 管理机制

    Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...