在网上看见一篇不错的文章,写的详细。

以下内容引用那篇博文。转载于《http://www.cnblogs.com/whgk/p/6426072.html》,在此仅供学习参考之用。

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

     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的访问路径也不一样,所以拷贝的话只需要拷贝关键代码即可。

web开发(四) 一次性验证码的代码实现的更多相关文章

  1. Java Web(四) 一次性验证码的代码实现

    其实实现代码的逻辑非常简单,真的超级超级简单. 1.在登录页面上login.jsp将验证码图片使用标签<img src="xxx">将绘制验证码图片的url给它 2.在 ...

  2. web开发四个作用域

    web开发一共有四个作用域,范围从高到低分为appliaction作用域(全局作用域),session作用域,request作用域和page作用域.${base}是el表达式语法,它会自动先从page ...

  3. JFinal Web开发学习(六)验证码验证和注册细节

    效果: 实现了注册界面的验证码验证.确认密码.密码md5加盐加密.C3P0插件数据库操作.读取外部配置文件. 1.在注册页面添加了确认密码输入框,修改了字段名称 <!DOCTYPE html&g ...

  4. 高效Web开发的10个jQuery代码片段(10 JQUERY SNIPPETS FOR EFFICIENT WEB DEVELOPMENT)

    在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...

  5. web开发中,前端javascript代码的组织结构

    网页包含三个层次: 结构(HTML) 表现(CSS) 行为(javascript) web标准中,三者要分离,网页源代码由三部分组成:.html文件..css文件和.js文件.就是说html文件中不应 ...

  6. Jquery学习总结(4)——高效Web开发的10个jQuery代码片段

    在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...

  7. java web开发及Servlet常用的代码

    日志 1.使用门面模式的slfj,并结合log4j,logback. 2.info.debug.error,要写清楚. 3.使用占位符,如下: log.info("用户id为: {} &qu ...

  8. 高效Web开发的10个jQuery代码片段

    原文转载:http://www.codeceo.com/article/10-jquery-snippets-web-dev.html

  9. Springboot 系列(六)Spring Boot web 开发之拦截器和三大组件

    1. 拦截器 Springboot 中的 Interceptor 拦截器也就是 mvc 中的拦截器,只是省去了 xml 配置部分.并没有本质的不同,都是通过实现 HandlerInterceptor ...

随机推荐

  1. 求二叉搜索树的第k小的节点

    题目描述: /** * 给定一棵二叉搜索树,请找出其中的第k小的结点. * 例如, (5,3,7,2,4,6,8)中, * 按结点数值大小顺序第三小结点的值为4. * 这是层序遍历: * 5 * 3 ...

  2. ubuntu下安装tensorflow-gpu版本过程

    我之前已经安装了cpu-only版的tensorflow,所以现在要先把原先的tf卸载 sudo pip uninstall tensorflow sudo pip3 install tensorfl ...

  3. Codeforces Round #344 (Div. 2) D. Messenger (KMP)

    D. Messenger time limit per test2 seconds memory limit per test512 megabytes inputstandard input out ...

  4. 牛客练习赛47 D DongDong坐飞机 (分层最短路)

    链接:https://ac.nowcoder.com/acm/contest/904/D 来源:牛客网 DongDong坐飞机 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  5. Mysql数据类型 来自官方手册5.6

    整形的取值范围:   定点数值(精确): 在MySQL中,NUMERIC被实现为DECIMAL,所以关于DECIMAL的以下说明同样适用于NUMERIC. MySQL以二进制格式存储DECIMAL值. ...

  6. centos7时区同步(时间24小时格式显示)

    我们在服务器安装linux系统时,有时会因服务器时间或者时区不正确导致程序出现错误. 首先输入date命令查看当前的时间和时区.要注意CST   EDT 等时区的区别 介绍一种与时间服务器上时间同步的 ...

  7. 生产环境跑PHP动态程序

    Nginx + PHP5(FastCGI)生产环境跑PHP动态程序可超过“700次请求/秒”   我生产环境下的两台Nginx + PHP5(FastCGI)服务器,跑多个一般复杂的纯PHP动态程序, ...

  8. orm中的聚合函数,分组,F/Q查询,字段类,事务

    目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...

  9. Android Studio 创建项目后“Cannot resolve symbol” 解决办法

    报错位置显示 “Cannot resolve symbol XXX”, 解决方法如下: 点击菜单中的 “File” -> “Invalidate Caches / Restart”,然后点击对话 ...

  10. html5 音乐 audio

    手机做小项目,需要添加音乐,做此笔记,依赖jquery,代码如下: <!DOCTYPE html> <html lang="en"> <head> ...