在日常的上网过程中,我们经常会有注册和登录操作,而通常的登录注册系统都会要求输入验证码以区别用户行为和计算机程序行为来防止恶意注册、暴力破解密码等。

一、验证码概念及其作用

1、验证码:就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

2、作用:验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登录、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。例如百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。

3、开发注意:由于验证码是随机产生的,有很大几率会出现无法清楚识别的验证码图片,所以需要注意的是,一般网站都会有相应的提示,如“看不清,换一张”等,如果没有提示,则直接点击当前的验证码图片,可以完成验证码的更换。

二、具体开发实现

1、开发servlet

创建工程后,创建SafeCodeServlet(记得要在web.xml中配置文件)

package com.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;public class SafeCodeServlet extends HttpServlet {public static final char[] CHARS = { '1', '2', '3', '4', '5', '6', '7','8', '9', 'k', 'A', 'Q', 'x', 'E', 'R', 'T', 'G', 'D', 'S', 'W','G', 'H', 'C', 'B', 'a', 'w', 'e', 'r', 't', 'd', 'F' };// 随机字符的字典public static Random random = new Random();// 随机数public static String getRandomString() {// 字符的缓存StringBuffer buf = new StringBuffer();for (int i = 0; i <4; i++) {// 循环 六次buf.append(CHARS[random.nextInt(CHARS.length)]);}return buf.toString();}public static Color getRandomColor() {return new Color(random.nextInt(255), random.nextInt(255),random.nextInt(255));}public static Color getReverseColor(Color c) {return new Color(255 - c.getRed(), 255 - c.getGreen(),255 - c.getBlue());}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("image/jpeg");// 设置输出的类型String randomString = getRandomString();// 得到返回的字符集request.getSession(true).setAttribute("randomString", randomString);int with = 80;int hight =36;// 生成图片的大小Color color = getRandomColor();// 用于背景色Color reverse = getReverseColor(color);// 用于前景色BufferedImage bi = new BufferedImage(with, hight,BufferedImage.TYPE_INT_RGB);// 创建一个彩色的图片Graphics2D g = bi.createGraphics();// 获取到绘图对象g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18));// 设置字体g.setColor(color);// 设置颜色g.fillRect(0, 0, with, hight);// 绘制背景g.setColor(reverse);// 设置颜色g.drawString(randomString, 18, 25);// 绘制随机字符for (int i = 0, n = random.nextInt(18); i < n; i++) {// 画最多100个噪音点g.drawRect(random.nextInt(with), random.nextInt(hight), 1, 1);// 随机噪音点}ServletOutputStream out = response.getOutputStream();// 转换图片格式JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);encoder.encode(bi);// 对图片进行编码out.flush();// 输出}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}}


<servlet>
<servlet-name>SafeCodeServlet</servlet-name>
<servlet-class>com.controller.SafeCodeServlet</servlet-class>
</servlet>    <servlet-mapping>
<servlet-name>SafeCodeServlet</servlet-name>
<url-pattern>/SafeCodeServlet</url-pattern>
</servlet-mapping>


2、jsp页面显示及调用

要点击图片和右边"看不清,换一张"两种方式都能实现重新生成验证码。

<tr>
<td>验证码:</td>
<td><input type="text" name="yzm" id="yzm">
<img alt="验证码" src="SafeCodeServlet" οnclick="go()" id="Identity">
<a href="javascript:void(0)" οnclick="go()">看不清,换一张</a></td>
</tr>
<script type="text/javascript">function go() {document.getElementById("Identity").src = 'SafeCodeServlet?a='+ new Date().getTime();}
</script>

3、登录/注册的输入验证

要判断用户输入的验证码是否和生成的验证码一致,一致则转到相应的页面,否则提示用户验证码输入有误。一般网站的验证码都是忽略大小写的,这点要注意。

String yzm = request.getParameter("yzm");//获取用户输入的验证码
String randomString = (String) request.getSession().getAttribute("randomString");//获取生成的验证码的字符串if (yzm.equalsIgnoreCase(randomString)) {//忽略大小写比较二者  out.print("登录成功:" + user + "<br>" + jl);//验证成功,再跳转到正确页面} else {out.print("验证码输入错误!!!");//验证失败,提示用户}

验证错误,提示用户!

Servlet开发验证码相关推荐

  1. 转: 通过Servlet生成验证码图片

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)-- 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedIma ...

  2. Servlet开发配置

    本文主要简单实践一下servlet开发相关开发 1.Servlet的创建 两种方法: 创建普通的java类,继承自HttpServlet类,在通过手动配置web.xml文件注册Servlet对象,比较 ...

  3. javaweb学习总结(五)——Servlet开发(一)

    http://www.cnblogs.com/xdp-gacl/p/3760336.html 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其 ...

  4. 电脑编程用户注册界面java_用JSP/Servlet开发简单的用户注册系统

    用JSP/Servlet开发简单的用户注册系统 2.4界面编程实现 通过JavaBeans封装了大部分的逻辑或数据操作功能.这样,JSP页面中就可以减少很多Java代码,从而使得JSP的建立和修改变得 ...

  5. javaweb学习总结(五):Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  6. 《Servlet学习笔记》Servlet开发细节-线程安全

    Servlet开发细节-线程安全 当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此servic ...

  7. javaweb基于JSP+Servlet开发水费管理系统+论文 大作业 毕业设计

    基于JSP+Servlet开发水费管理系统+论文(大作业/毕业设计) 开发环境:   Windows操作系统 开发工具:MyEclipse+Jdk+Tomcat+SQLServer数据库 运行效果图: ...

  8. javaweb基于JSP+Servlet开发大数据与应用专业企业门户网站源码 课程设计 大作业

    基于JSP+Servlet开发大数据与应用专业企业门户网站:(大作业/课程设计) 开发环境: Windows操作系统 开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: ...

  9. javaweb基于JSP+Servlet开发药店(私人诊所)管理系统设计与实现源码+论文 +视频讲解 毕业设计

    基于JSP+Servlet开发私人诊所(药店)管理系统设计与实现+论文:(毕业设计/课程设计) 开发工具: MyEclipse+Jdk+Tomcat+SQLServer数据库 运行效果图 基于JSP+ ...

最新文章

  1. C语言文件操作基本常识
  2. 古典概型中的几何体计数
  3. Bootstrap3.0入门学习系列规划[持续更新]
  4. HTML下的list w3c,W3.CSS Lists (列表)
  5. CentOS Mysql安装配置
  6. 设置内核的运行环境之隔离的应用程序
  7. Verilog初级教程(6)Verilog模块与端口
  8. 用Navicat制作ER图及与SQL互相转化
  9. python调用win32api详解_Python调用Win32 API实现截图
  10. android killer反编译闪退,Android Killer反编译失败
  11. BootDo框架中使用bootstrap设置多个按钮的下拉按钮
  12. New Bing怼人、说谎、PUA,ChatGPT已经开始胡言乱语了
  13. 微信公众号对接网课查题系统
  14. [ZJOI2015]醉熏熏的幻想乡
  15. 穆穆推荐-软件销售行业软件公司销售参考操作手册-之5-软件行业客户分类及销售人员激励
  16. equals == equals(null) ==null区别
  17. TIA博途中FC功能块的介绍与管脚定义
  18. Java,看完我工资从12K变成了20K
  19. YX150C 纯IO口 8位OTP单片机
  20. 国外导师对博士后申请简历的几点建议

热门文章

  1. 企业网站如何做好搜索引擎优化
  2. solidity msg.sender.transfer发送给谁
  3. [GUI] 使用MATLAB从图片中提取曲线数据
  4. 【element】elementUI-中折叠面板箭头图标位置调整往左边
  5. (每日一练c++)有效的数独
  6. 智慧环卫管理系统方案
  7. 2022最新阿里P6+Java技术体系图
  8. You must restart adb and Eclipse处理方法(sjk_daemon.exe占用5037端口)
  9. 微商城应该怎样选择?
  10. es where_阿水出现在eStar二队,ES.JackeyLove正在连接?