简单验证码生成Java版

验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字、字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的。好了废话不多说一起往下看:

简单的登录页面(代码并不完整,只有验证码部分)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>验证码</title>
 <script type="text/javascript">
<span style="white-space:pre" data-filtered="filtered"></span><span style="white-space:pre"> </span> //刷新验证码的js函数
<span style="white-space:pre"> </span>function changeCode() {
<span style="white-space:pre"> </span>var imgNode = document.getElementById("vimg");   

<span style="white-space:pre"> </span>//重新加载验证码,达到刷新的目的
<span style="white-space:pre"> </span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random(); // 防止浏览器缓存的问题
<span style="white-space:pre"> </span>}
 </script>
 </head>
 <body>
 <form action="checkServlet" method="post">
 <label>输入验证码</label><br/>
 <input type="text" name="randomCode"/><img id="vimg" title="点击更换" onclick="changeCode();" src="servlet/AuthImageServlet"><br/>
 <input type="submit" value="submit">
 </form>
 </body>
</html>

通过session.getAttribute("rand"),获得生成的验证码,然后跟用户输入的进行比较,再根据比较结果做相应的处理。

通过servlet生成验证码:

package com.util.servlet; 

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
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;
import javax.servlet.http.HttpSession; 

public class AuthImageServlet extends HttpServlet { 

 private static final String CONTENT_TYPE = "text/html; charset=gb2312";
 //设置字母的大小,大小
 private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);
 public void init() throws ServletException
 {
 super.init();
 }
 Color getRandColor(int fc,int bc)
 {
 Random random = new Random();
 if(fc>255) fc=255;
 if(bc>255) bc=255;
 int r=fc+random.nextInt(bc-fc);
 int g=fc+random.nextInt(bc-fc);
 int b=fc+random.nextInt(bc-fc);
 return new Color(r,g,b);
 } 

 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {
 response.setHeader("Pragma","No-cache");
 response.setHeader("Cache-Control","no-cache");
 response.setDateHeader("Expires", 0);
 //表明生成的响应是图片
 response.setContentType("image/jpeg"); 

 int width=100, height=18;
 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

 Graphics g = image.getGraphics();
 Random random = new Random();
 g.setColor(getRandColor(200,250));
 g.fillRect(1, 1, width-1, height-1);
 g.setColor(new Color(102,102,102));
 g.drawRect(0, 0, width-1, height-1);
 g.setFont(mFont); 

 g.setColor(getRandColor(160,200)); 

 //画随机线
 for (int i=0;i<155;i++)
 {
  int x = random.nextInt(width - 1);
  int y = random.nextInt(height - 1);
  int xl = random.nextInt(6) + 1;
  int yl = random.nextInt(12) + 1;
  g.drawLine(x,y,x + xl,y + yl);
 } 

 //从另一方向画随机线
 for (int i = 0;i < 70;i++)
 {
  int x = random.nextInt(width - 1);
  int y = random.nextInt(height - 1);
  int xl = random.nextInt(12) + 1;
  int yl = random.nextInt(6) + 1;
  g.drawLine(x,y,x - xl,y - yl);
 } 

 //生成随机数,并将随机数字转换为字母
 String sRand="";
 for (int i=0;i<6;i++)
 {
  int itmp = random.nextInt(26) + 65;
  char ctmp = (char)itmp;
  sRand += String.valueOf(ctmp);
  g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
  g.drawString(String.valueOf(ctmp),15*i+10,16);
 } 

 HttpSession session = request.getSession(true);
 session.setAttribute("rand",sRand);
 g.dispose();
 ImageIO.write(image, "JPEG", response.getOutputStream());
 } 

}

web.xml中的servlet配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
 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_2_5.xsd"> 

 <servlet>
 <servlet-name>AuthImageServlet</servlet-name>
 <servlet-class>com.util.servlet.AuthImageServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>AuthImageServlet</servlet-name>
 <url-pattern>/servlet/AuthImageServlet</url-pattern>
 </servlet-mapping> 

 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

就这样验证码的功能就实现了,很简单、很实用。当然还有更加美观,更加严密的方式,有兴趣的朋友可以深入研究。这里就跟大家分享一个比较简单的方式。欢迎各位批评指正。

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

(0)

相关推荐

  • 浅析Java验证码生成库JCaptcha

    JCaptcha是非常强大的,不光是可以生成图片式的验证码,还可以生成声音式的(新浪就使用了双重验证码).本文简单的介绍了JCaptcha库以及使用实例,下面一起来看看. 下载JCaptcha库 maven依赖如此添加: <dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha</artifactId> <version>1.0</version&

  • 基于Java随机生成手机短信验证码的实例代码

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return StringUtils.leftPad(new Random().nextInt(10000) + "", 4, "0"); } 复杂版 /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return

  • 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 生成任意长度的验证码过程解析

    需求说明 1.要求生成任意长度的验证码 2.验证码要求包含大小写英文字母和数字 实现方式 采用随机数的方式,分别在数字,大小写英文字母里面抽取字符,抽取次数由for循环控制 代码内容 随机的方法及程序入口 package com.work.work3; /** * @auther::9527 * @Description: 验证码生成器 * @program: shi_yong * @create: 2019-07-30 20:45 */ public class Method { //采用ch

  • java生成图片验证码示例代码

    本文实例为大家分享了java图片验证码具体实现代码,供大家参考,具体内容如下 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.u

  • java随机验证码生成实现实例代码

    java随机验证码生成实现实例代码 摘要: 在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配 之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的人提出了不同的解决方案,但是很多人都使用了com.sun.image.这个包或者子包里面的类,而这个包结构下面的类都是不推荐使用的,我们应该依赖于java.或者javax.这些包结构下面的类,否则将来的可移植性就很不好(比如换成IBM的JDK就不行了),但

  • 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生成验证码工具类

    java生成验证码工具类,供大家参考,具体内容如下 package com.demo.utils; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.QuadCurve2D; import java.awt.image.BufferedIm

  • 简单验证码生成Java版

    验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的.好了废话不多说一起往下看: 简单的登录页面(代码并不完整,只有验证码部分) <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> &l

  • java实现简单验证码生成

    本文实例为大家分享了java验证码生成的具体代码,供大家参考,具体内容如下 简单验证码java实现--servlet类生成 验证码img,并写入session 老师给的源码,在此做个记录,简单验证码,java绘图 在此鸣谢并附上源码:. // package app61; import java.io.*; import java.util.*; import com.sun.image.codec.jpeg.*; import javax.servlet.*; import javax.ser

  • PHP 用session与gd库实现简单验证码生成与验证的类方法

    验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的.目前大大小小的网站都有验证码.今天自己实现了一个简单的验证码类.说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下.当然,因为字体的原因,要想一眼看出来并不容易.同时,为了避免字母的大小写与数字混淆,又去掉了那些看起来很像的字母数字. 类: <?php /** *简单生成验证码类 */ class Captcha { private $width;//验证码宽度 private $height;//验证码高度 privat

  • Java版仿QQ验证码风格图片验证码

    本文为大家分享了Java版仿QQ验证码风格图片验证码,具体内容如下 功能包括:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,干扰线,噪点,背景扭曲. 本来想做字符扭曲的,不知道怎的先生成文字再扭曲就报错了,先就这样吧,希望有高手能帮助修正一下. 需要说明的是之所以有几分像QQ的验证码感觉是因为这个Algerian字体,如果系统没有的话需要自行安装,百度搜字体名能下载到,丢系统Fonts文件夹就行. 效果图: package hh.com.util; impor

  • 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后台验证码生成的实现方法

    效果图如下: 1.适用需求 后台生成验证码,用于登陆验证. 2. 功能实现所需控件/文件: 无(普通标签) 3.功能点实现思路 1)前台思路: (1)前台一个<input>用于输入验证码:一个<img>用于展示验证码. (2)验证码生成以及展示,点击刷新功能,可以为<img>绑定click事件. (3)click事件里面写ajax请求,通过后台生成处理好的带噪点的验证码图片. 注意:后台直接返回图片,不是验证码的字符!若返回字符,则验证码就失去了意义(前台很容易就可以获

  • Java版C语言版简单使用静态语言实现动态数组的方法

    动态语言相对于静态语言的一个优势,就是数组可以不需要预先确定大小,对于一些数组长度不确定的场景下是非常有用的.像PHP,只需要声明一下数组 $arr = array() 然后就可以直接 $arr[] = 1,$arr[] = 2,$arr[] = 3...这样一直加元素了,删除一个元素就直接使用unset($arr[1]),元素的空间就被释放了,而C和JAVA原生的数组就没有这么方便,声明的时候就必须先预先确定长度,由编译器分配相应的内存空间.不过通过一些巧妙的做法,也是可以实现一样的功能的,这

  • java验证码生成具体代码

    本文实例为大家分享了java验证码生成的示例代码,供大家参考,具体内容如下 package com.gonvan.component.captcha; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.imag

  • 自己动手写一个java版简单云相册

    动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件. 用户可以下载其他人上传的图片. 用户可以查看其他所有人的图片. 用户只能删除通过自己IP上传的图片. 用到的技术: 文件上传下载.设计模式.Dom4j.xPath等. 先看下2个页面: 源代码: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns=

随机推荐