java图片验证码生成教程详解

首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现。

先来看最简单的—实现的功能是,将一个字符串变成图片写入到文件中

实现代码:

package cn.hncu.img;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
//该类包含一些用来查找 ImageReader 和 ImageWriter 以及执行简单编码和解码的静态便捷方法。

import org.junit.Test;

public class ImgDemo {

 //学习如何把一个字符串变成图片写到一个文件
 @Test
 public void ImgDemo1() throws FileNotFoundException, IOException{
  BufferedImage img = new BufferedImage(60, 30, BufferedImage.TYPE_INT_RGB);
  // 表示一个图像,它具有合成整数像素的 8 位 RGB 颜色分量。
  Graphics g = img.getGraphics();
  g.drawString("Hello",10,20);
  //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处。
  g.dispose();////类似于流中的close()带动flush()---把数据刷到img对象当中
  //释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。
  ImageIO.write(img, "JPG", new FileOutputStream("img/a.jpg"));
  //使用支持给定格式的任意 ImageWriter 将一个图像写入 File。
 }

}

结果:

上面那个很简单,对不对,我们看到的验证码都不是这样的,那好,我们给它加点干扰线,背景色,字符和y坐标随机生成。

有干扰线、背景色的验证码-写入文件

演示代码:

package cn.hncu.img;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;
//该类包含一些用来查找 ImageReader 和 ImageWriter 以及执行简单编码和解码的静态便捷方法。

import org.junit.Test;

public class ImgDemo {
 //把上面的字符串改成我们平时用的验证码---生成几个随机数字,有背景色和干扰线
 @Test
 public void ImgDemo2() throws FileNotFoundException, IOException{
  int width = 80;
  int height= 40;
  int lines = 10;
  BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  Graphics g = img.getGraphics();

  //设置背景色
  g.setColor(Color.white);
  g.fillRect(0, 0, width, height);//画背景
  //填充指定的矩形。使用图形上下文的当前颜色填充该矩形

  //设置字体
  g.setFont(new Font("宋体", Font.BOLD, 18));

  //随机数字
  Date d = new Date();
  //System.out.println(d.getTime());
  Random r = new Random(d.getTime());
  for(int i=0;i<4;i++){
   int a = r.nextInt(10);//取10以内的整数[0,9]
   int y = 10+r.nextInt(20); //10~30范围内的一个整数,作为y坐标
   Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
   g.setColor(c);
   g.drawString(""+a, 5+i*width/4, y);
  }
  //干扰线
  for(int i=0;i<lines;i++){
   Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
   g.setColor(c);
   g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
  }

  g.dispose();//类似于流中的close()带动flush()---把数据刷到img对象当中
  ImageIO.write(img, "JPG", new FileOutputStream("img/b.jpg"));

 }

}

演示结果:

最后来看一个可以旋转和放缩的验证码-写到图片本地文件中

演示代码:

package cn.hncu.img;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;
//该类包含一些用来查找 ImageReader 和 ImageWriter 以及执行简单编码和解码的静态便捷方法。

import org.junit.Test;

public class ImgDemo {
 @Test//可以旋转和放缩的验证码
 public void ImgDemo3() throws FileNotFoundException, IOException{
  int width = 80;
  int height = 40;
  int lines = 10;
  BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  Graphics2D g2d = (Graphics2D)img.getGraphics();

  g2d.setFont(new Font("宋体", Font.BOLD, 20));

  Random r = new Random(new Date().getTime());

  //设置背景色
  g2d.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
  g2d.drawRect(0, 0, width, height);//绘制指定矩形的边框。
  g2d.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
  g2d.fillRect(0, 0, width, height);//填充指定的矩形。

  for(int i=0;i<4;i++){
   String str = ""+r.nextInt(10);

   //处理旋转
   AffineTransform Tx = new AffineTransform();
   Tx.rotate(Math.random(), 5+i*15, height-5);
   //用弧度测量的旋转角度,旋转锚点的 X 坐标,旋转锚点的 Y 坐标
   //Tx.scale(0.7+Math.random(), 0.7+Math.random());
   //x坐标方向的缩放倍数,y坐标方向的缩放倍数
   g2d.setTransform(Tx);
   Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
   g2d.setColor(c);
   g2d.drawString(str, 2+i*width/4, height-13);
  }

  //干扰线
  for(int i=0;i<lines;i++){
   Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
   g2d.setColor(c);
   g2d.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
  }

  g2d.dispose();

  ImageIO.write(img, "JPG", new FileOutputStream("img/c.jpg"));
 }
}

演示结果:

下面就要开始演示前台的图片验证技术了。

前台的图片验证技术

这个项目的结构图:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <script type="text/javascript">
  function changImg(){
   var img = document.getElementById("servletImg");
   var d = new Date();
   var time = d.getTime();//如果没有这个
   //下面这一句不会起作用,因为浏览器的缓存技术,图片并不会刷新
   //img.src="/myHelloWeb/servlet/ImageServlet";
   img.src="/myHelloWeb/servlet/ImageServlet?"+time;
   //?号后面的东西是通过get方式传递的
  }

 </script>
 </head>

 <body>
 这是我的手动主页!
 <br/>
 <img id="servletImg" src="/myHelloWeb/servlet/ImageServlet" /><a href="javascript:changImg()">看不清</a>
 </body>
</html>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name></display-name>
 <servlet>
 <description>This is the description of my J2EE component</description>
 <display-name>This is the display name of my J2EE component</display-name>
 <servlet-name>ImageServlet</servlet-name>
 <servlet-class>cn.hncu.img.ImageServlet</servlet-class>
 </servlet>

 <servlet-mapping>
 <servlet-name>ImageServlet</servlet-name>
 <url-pattern>/servlet/ImageServlet</url-pattern>
 </servlet-mapping>
 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

ImageServlet.java

package cn.hncu.img;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doPost(request, response);
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //告诉客户端,输出的格式
  response.setContentType("image/jpeg");

  int width = 80;
  int height = 40;
  int lines = 10;
  BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  Graphics g = img.getGraphics();

  //设置背景色
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, width, height);

  //设置字体
  g.setFont(new Font("宋体", Font.BOLD, 20));

  //随机数字
  Random r = new Random(new Date().getTime());
  for(int i=0;i<4;i++){
   int a = r.nextInt(10);
   int y = 10+r.nextInt(20);//10~30范围内的一个整数,作为y坐标

   Color c = new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));
   g.setColor(c);

   g.drawString(""+a, 5+i*width/4, y);
  }

  //干扰线
  for(int i=0;i<lines;i++){
   Color c = new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));
   g.setColor(c);
   g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
  }

  g.dispose();//类似于流中的close()带动flush()---把数据刷到img对象当中

  ImageIO.write(img, "JPG", response.getOutputStream());
 }

}

演示结果:

下面这个是在index.jsp中:
如果是用这句:
img.src=”/myHelloWeb/servlet/ImageServlet”;

大家可以看看响应头:

再看看用这句的响应头:
img.src=”/myHelloWeb/servlet/ImageServlet?”+time;

多了个Date响应!
因为时间一直在变,所以每次点看不清,都会再向服务器请求一次,而不会因为浏览器的缓存,而不去请求了。

验证码就先到这里结束啦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中使用patchca生成超炫的验证码

    官网:http://code.google.com/p/patchca/ /** * 验证码 * * @param width 图片宽度 * @param height 图片高度 * @param number 验证码数量 */ @RequestMapping(value = {"/captcha"}) public void captcha(HttpServletRequest request, HttpServletResponse response, @RequestParam(

  • Java Web项目中验证码功能的制作攻略

    一.前言 在表单页面中使用验证码的好处在于有效防止用户恶意提交表单,或者使用外挂非法攻击系统. 二.准备条件 1.一个普通的web项目 webProject: 2.一个web服务器 Tomcat. 三.实现思路: 1.自定义一个servlet  VerifyCodeServlet 画一个包含验证字符的验证码图片,这里的图片需要使用Graphics2D手动去画: 2.在具体页面使用img标签的src引用这个servlet即可显示servlet: 3.因为画图的时候把验证码信息放入了session,

  • Java实现仿淘宝滑动验证码研究代码详解

    通过下面一张图看下要实现的功能,具体详情如下所示: 现在我就来介绍些软件的其它功能.希望大家有所受益. 模拟人为搜索商品 在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索. 在这一个过程中有两个难点: 1)商品列表的异步加载 ; 2)翻页并且截图; 在园子里,我就不在关公面前耍大刀了. 直接上关键代码: i:搜索商品,并且翻页 public bool? SearchProduct(TaskDetailModel taskDetailData) { bool? result

  • Java生成图形验证码工具类

    生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.Ou

  • JAVA实现利用第三方平台发送短信验证码

    前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较. 为了防止有广告嫌疑

  • Java使用云片API发送短信验证码

    下面开始介绍的是如何利用机器完成批量操作,将短信业务自动化. 获取APIKEY 云片网提供了完整的SDK和API,可以帮助开发者快速完成业务开发. 在开始Coding前,需要先获取APIKEY,如下所示. 获取APIKEY 点击眼睛按钮后,输入验证码,就可以查看APIKEY了. 这里需要说明的是,APIKEY特别重要,一定要保护好它,避免泄露.云片这边提供了几重保护机制,例如验证.敏感处理.子账号独立APIKEY等,看得出来他们的安全意识还是挺不错的. 开始Coding 有了APIKEY,就可以

  • java图片验证码生成教程详解

    首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现. 先来看最简单的-实现的功能是,将一个字符串变成图片写入到文件中 实现代码: package cn.hncu.img; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOE

  • java中TestNG使用教程详解

    目录 一.TestNG介绍 二.TestNG安装(基于eclipse+maven) 三.TestNG基本使用和运行 1.直接运行: 2.xml方式运行 四.注解说明 五.TestNG断言 六.TestNG预期异常测试 七.TestNG忽略测试 八.TestNG超时测试 九.分组测试 十.分suite测试 十一.依赖测试 十二.参数化测试 十三.XML配置文件说明 1.suite标签 2.test标签 3.group标签 4.其他 十四.TestNG报告 一.TestNG介绍 TestNG是Jav

  • Java中自动生成构造方法详解

    Java中自动生成构造方法详解 每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法,如果类一但声明有构造方法,就不会产生了.证明如下: 例1: class person { person(){System.out.println("父类-person");} person(int z){} } class student extends person { // student(int x ,int y){super(8);} } class Rt { public st

  • Linux server配置安装Java与Tomcat服务器教程详解

    系统:Ubuntu 16.04 dev_desktop 1.Java安装并配置环境变量 (1)从Java官方网站下载最新版JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载jdk压缩包 jdk-8u144-linux-x64.tar.gz (2)  将压缩包解压并复制到/usr/lib 目录下 tar -zxvf jdk-8u144-linux-x64.tar.gz sudo cp -r ./jdk

  • JAVA图片水印开发案例详解

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上搭建的,基于Spring+SpringMVC.如果有错误还请大家指正. 最后源码地址在:https://github.com/allanzhuo/myport.git . 简单介绍 水印开发是web开发中一种比较常见的功能,实现的代码很简单,具体的实现步骤我也会以代码为基础详细讲述.其实以我个人的理

  • Java Redis Redisson配置教程详解

    目录 需要的Maven application-redis.yml Session共享配置 其他Redisson的Config配置方式 Redisson的Config(单机版配置) Redisson的Config(哨兵版配置) Redisson的Config(主从版配置) Redisson的Config(集群模式) Redisson的Config(红锁模式) 需要的Maven <!--redis--> <dependency> <groupId>org.springfr

  • android自动生成dimens适配文件的图文教程详解(无需Java工具类)

    在编写ui界面时因为手机分辨率大小不同,所以展现出来的效果也是不同的,这个时候就需要考虑适配器,让根据手机分辨率自动适配相应尺寸来展示界面,可以提高用户的体验感. 1.首先安装插件ScreenMatch,安装成功之后android studio会提示重启 2.在res->values下创建一个dimens文件,将以下代码复制进去.如果不创建这个文件一下操作会不成功导致项目重启. <dimen name="common_margin">@dimen/dp_15</

  • Java MeteoInfo解析与绘图代码教程详解

    最近太忙了,终于有时间继续写了,上文说到了基本上的绘图方法,但缺少色阶呈现,一般图叠加着地图上,后端不需要管色阶,但也要注意web页面色阶和我们的生成色阶一定要对的上 对于后端导出图片的话,就需要添加色阶了,这一文很简单,就涉及色阶,名称,网格刻度线 顺便对代码我进行了优化,看起来更直接 MeteoDataInfo meteoDataInfo = new MeteoDataInfo(); meteoDataInfo.openMICAPSData("D:\\解析数据\\cldas\\cldas\\

  • phpcms实现验证码替换及phpcms实现全站搜索功能教程详解

    在使用phpcms替换网页的时候,除了正常的替换栏目.内容页等,其他的什么验证码啦,提交表单了,搜索功能了,这些在替换的时候可能会对一些默认文件有一些小小 的改变 下面就是自己在失败中成功的过程,最后终于替换成没有bug的替换 一.phpcms的验证码替换 有验证码的地方,一般就是表单了,那么首先就要先制作表单出来了,表单的制作过程很简单,如下: A.制作一张表单出来 (1)登录自己的phpcms后台管理 (2)登录进去后,按照这个步骤进行添加表单 a.模块------表单向导:如图 b.打开表

  • java 中maven pom.xml文件教程详解

    maven pom.xml文件教程详解,具体内容如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.x

随机推荐