我们知道在我们注册用户的时候一般都有一段模糊的验证码让我们输入,其实我们自己也可以实现这个验证码 ,验证码的好处是为了防止某些自动提交软件的而已行为  。

下面就利用Servlet +JSP+JavaBran实现一个验证码机制。

BufferedImage  可以操作缓冲区的 内部Image,可以被ImageIO输出到输出流中 ,我们就是利用PrintWriter可以想浏览器输出信息的原理我们输出Image图片 。

1、产生验证码的类 MakePicture

package me.test;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.Random;
import java.io.OutputStream;
import java.io.IOException;
public class MakePicture  //产生识别验证图像
{   private char charTable[]={'a','A','b','B','c','C','d','D' ,'e','E' ,'f','F','g','G','h','H','i','I','j','J' ,'0','1','2','3','4','5','6','7','8','9'}; public String drawPicture(int width,int height,OutputStream os){if(width<=0)width=100 ;if(height<=0) height=60 ;BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB) ;Graphics g=image.getGraphics()  ;g.setColor(Color.LIGHT_GRAY) ; g.fillRect(0, 0, width, height)  ;g.setColor(new Color(0x5265fd)) ;g.drawRect(0, 0, width, height)  ;  String str ="" ;for(int x=0;x<4;x++){str+=charTable[(int) (Math.random()*charTable.length)];}g.drawString(str.substring(0, 1), 0, 15);g.drawString(str.substring(1, 2), 15, 17);g.drawString(str.substring(2, 3), 35, 19);g.drawString(str.substring(3, 4), 50, 16);Random rand=new Random() ;for(int i=0;i<10;i++){int x=rand.nextInt(width)  ;int y=rand.nextInt(height)  ;   g.drawOval(x, y, 1, 1) ;}g.dispose()  ;try {ImageIO.write(image, "JPEG",os) ;} catch (IOException e) {e.printStackTrace();return "" ;}return str ;}}

2、index.jsp首页  这个页面通过请求Servlet输出验证码

<%@ page language="java" contentType="text/html; charset=gb2312"pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>图片验证</title>
</head>
<body><form action="yanzheng.jsp" method="get">
验证码: <input type="text" name="code" />
<img  src="show"><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>

3、yanzheng.jsp 验证输入的字符是否正确

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%out.print(request.getParameter("code")) ;%>
</body>
</html>

4、实现http请求的Servlet实现类  ImageServlet

package me.test;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ImageServlet extends HttpServlet
{   @Overrideprotected void service(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {MakePicture mp=new MakePicture() ;String str=mp.drawPicture(60, 20,res.getOutputStream() ) ;req.getSession().setAttribute("pic", str) ;res.getOutputStream().print(str) ;}}

转载于:https://www.cnblogs.com/yuedongwei/archive/2012/05/05/4145483.html

java web中验证码的实现相关推荐

  1. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别 参考文章: (1)java ...

  2. Java Web中的中文编码问题分析

    一.为什么需要编码 在计算机中存储信息的最小单位是1个字节,即8bit,所以能标识的最大字符范围是0~255,而人类自然语言中例如汉语.日语要表示的符号太多,无法单纯用一个字节来完全表示,为了解决这个 ...

  3. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  4. 第三章 深入分析Java Web中的中文编码问题

    3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...

  5. 用servlet路径访问一个html,java web中servlet、jsp、html 互相访问的路径问题

    在html">java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. html">java web中的路径使用按我的分法可以分两种情况,当 ...

  6. java web 中 读取windows图标并显示

    java web中读取windows对应文件名的 系统图标 ....显示 1.获取系统图标工具类 package utils;  import java.awt.Graphics;  import j ...

  7. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

  8. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 参考文章: (1)解决java web中safari浏览器下载后文件中文乱码问题 (2)https://www.cnblogs.com/ ...

  9. 深入分析 Java Web 中的中文编码问题

    深入分析 Java Web 中的中文编码问题 背景: 编码问题一直困扰着程序开发人员,尤其是在 Java 中更加明显,因为 Java 是跨平台的语言,在不同平台的编码之间的切换较多.接下来将介绍 Ja ...

最新文章

  1. 90 后女科学家,四年完成清华大学硕博连读,解决多个世界级难题
  2. 抽象工廠與工廠方法的區別
  3. 【RPC服务器不可用】解决方法
  4. oracle 中关于null的操作
  5. 学习笔记98—从矩阵坐标转换至MNI坐标
  6. MySQL 乐观锁与悲观锁
  7. python做乘法运算定律_最新乘法运算定律专项练习题
  8. CodeForces - 1321E World of Darkraft: Battle for Azathoth(二维偏序+线段树)
  9. 鸿蒙系统用没有安卓的代码,套壳?不存在!纯鸿蒙系统不含任何安卓代码,其他手机厂商可使用...
  10. 配置linux系统ip,Linux系统IP地址配置
  11. postman rpc本地调用_什么是RPC,你知道嘛?
  12. linux软件安装和卸载
  13. IntelliJ IDEA 使用教程(2019图文版)
  14. 基于MATLAB函数mesh绘制由多张曲面围成的三维封闭曲面详解
  15. ubuntu dkms报错
  16. C# 程序图标设置/winform 图标
  17. 华为鸿蒙麒麟玉兔_鸿蒙、麒麟、鲲鹏……这是属于中华的浪漫
  18. 电脑上怎么录制视频 电脑实用快捷键
  19. commit在c语言中的作用,【单选题】SQL语 言 中 COMMIT语句的主要作用是( ) A. 结束程序 B. 返回系统 C. 存储数据 D. 提交事务...
  20. 利用Lambda表达式从实体集合中筛选出符合条件的实体集合

热门文章

  1. 安置和设置Opera9.50Beta2
  2. SQLite关于时间段查询的sql
  3. ffmpeg中av_strlcpy替换了pstrcpy
  4. make xconfig 报‘ptrdiff_t’ does not name a type错误解决方法
  5. Linux下Nginx、MySQL、PHP5、phpMyAdmin安装与配置
  6. php endall(),从G_BEGIN_DECLS和 G_END_DECLS说起
  7. c语言条件编译的例子,C语言条件编译分析实例
  8. httpcline转发_如何实现Http请求报头的自动转发[应用篇]
  9. python用for循环读取图片_python 使用for循环简单爬取图片(1)
  10. CDN应用进阶 | 正确使用CDN 让你更好规避安全风险