简单实现Java验证码功能

今晚看到网上有关验证码的实现的代码,很早就想写一个了,感觉验证码挺有意思的,于是就写了一个,然而后来一直加载不出图片。尝试了很多方法,后来终于解决了,原来是我项目里面的 web.xml中没有部署servlet的映射,web.xml如下图:

运行效果如下:

代码如下:

package model; 

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random; 

/**
 * Created by Petty on 2017/5/4.
 */
public class VCode { 

 private int w; //图片宽
 private int h;//图片高
 private Color bgColor = new Color(240,240,240);//背景色
 private Random random = new Random();//随机对象
 //设置字体范围
 private String[] fontNames = {"宋体","华文楷体","黑体","华文新魏","华文隶书","微软雅黑","楷体"};
 //设置字体样式范围
 private int[] fontstyle = {0,1,2,3};
 //设置字号范围
 private int[] fontSizes = {24,25,26,27,28};
 //设置所有字符串范围
 private String codes="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 

 //无参数构造函数
 public VCode(){ 

 } 

 //带宽和高的构造函数
 public VCode(int w,int h){
  this.w = w;
  this.h = h;
 } 

 //返回一张背景图片
 private BufferedImage createImage(){
  /**
   * 1.创建图片 2.设置背景色
   */
  //创建图片
  BufferedImage img = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
  //设置背景色
  Graphics g = img.getGraphics();
  g.setColor(bgColor);
  g.fillRect(0,0,w,h);
  return img;
 } 

 // 随机返回字体颜色
 private Color randomColor() {
     int r = random.nextInt(256);
     int g = random.nextInt(256);
     int b = random.nextInt(256);
   return new Color(r, g, b);
   } 

 //随机返回字体样式
 private Font randomFont(){
  //随机生成字体下标,随机从给定的范围内获取一个字体
  int index = random.nextInt(fontNames.length);
  String name = fontNames[index]; 

  //随机生成字体样式下标,随即从给定的范围内获取一个字体样式
  index = random.nextInt(fontstyle.length);
  int style = fontstyle[index]; 

  //随机生成字体大小下标,随机从给定的范围内获取一个字体大小
  index = random.nextInt(fontSizes.length);
  int size = fontSizes[index]; 

  return new Font(name,style,size);
 } 

 //随机返回字体内容
 private String randomChar(){
  int index = random.nextInt(codes.length()); 

  return codes.charAt(index)+"";
 } 

 //随机返回几条干扰线
 private void getLine(BufferedImage img){
  //设置干扰线的宽度为1.5倍宽,随机画五条
  Graphics2D g =(Graphics2D) img.getGraphics();
  g.setColor(Color.BLACK);
  g.setStroke(new BasicStroke(1.5f));
  for(int i=0;i<5;i++){
   int x1 = random.nextInt(w);
   int y1 = random.nextInt(h);
   int x2 = random.nextInt(w);
   int y2 = random.nextInt(h);
   g.drawLine(x1,y1,x2,y2);
  }
 } 

 //用户调用该方法获取图片
 public BufferedImage getImage(){
  /**
   * 随机生成字符0-9A-Za-z,设置字体,字号,是否粗体,字符颜色,都是随机的
   */
  BufferedImage img = createImage(); 

  this.getLine(img); 

  //获取画笔
  Graphics g = img.getGraphics(); 

  //画内容
  for(int i=0;i<4;i++){
   g.setColor(this.randomColor());//获取随机颜色
   g.setFont(this.randomFont());//获取随机字体
   g.drawString(this.randomChar(),w/4*i,h-5);//获取字符串随机内容
  }
  return img;
 } 

 //用户调用该方法保存图片到本地
 public void saveImage(BufferedImage img, OutputStream ous){ 

  try {
   ImageIO.write(img,"JPEG",ous);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}
package model; 

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException; 

/**
 * Created by Petty on 2017/5/4.
 */
@WebServlet(name = "BServlet")
public class BServlet extends HttpServlet {
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  VCode v = new VCode(70,35);
  BufferedImage img = v.getImage();
  v.saveImage(img,response.getOutputStream());
 } 

 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  VCode v = new VCode(70,35 );
  BufferedImage img = v.getImage();
  v.saveImage(img,response.getOutputStream());
 }
}
<%--
 Created by IntelliJ IDEA.
 User: Petty
 Date: 2017/5/4
 Time: 22:28
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head>
 <title>一次性验证码</title>
 </head>
 <body>
 <form action="" method="get">
  <table align="center">
   <tr>
    <td><img id="img" alt="" src="servlet/BServlet" onclick="changeNext()"></td>
   </tr>
  </table>
 </form>
 </body>
</html>
<script type="text/javascript">
 function changeNext(){
  var a=document.getElementById("img");
  a.src="servlet/BServlet?a="+new Date().getTime();
 }
</script>

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

(0)

相关推荐

  • Java实现验证码具体代码

    这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能. Java实现验证码的步骤: 1.创建RandomImageGenerator.java类,该类实现验证码图片的生成 2.创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面 3.创建一个Action类,LoginAction.java,控制登录 4.配置struts.xml一个web.xml文件 5.编写页面 具体实现用代码表达 1.创建RandomImageGener

  • java登录验证码实现代码

    VerifyCodeServlet.java类: 复制代码 代码如下: package com.spring.controller;import java.awt.Color;         import java.awt.Font;         import java.awt.Graphics2D;         import java.awt.image.BufferedImage;         import java.util.Random;         import ja

  • java 图片验证码的实现代码

    复制代码 代码如下: makeCertPic.java package pic; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imagei

  • Java随机生成手机短信验证码的方法

    本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return */ public static String createRandom(boolean numberFlag, int length){ String retStr = ""; String strTable = numberFlag ? "1234

  • java生成图片验证码示例程序

    复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">&l

  • Java Web开发之图形验证码的生成与使用方法

    本文实例讲述了Java Web开发之图形验证码的生成与使用方法.分享给大家供大家参考.具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度. 图形验证码的使用包括如下3部分: ① 图形验证码的生成: ② 在页面中的使用: ③ 验证: 1.图形验证码的生成 假设在Servlet生成图形验证码,在JavaBean或者JSP中生成的基本过程是相同的.设计如下过程: ① 设置响应的文档类型: ② 生成随机码: ③ 把随机码保存到session中: ④ 生成图片:

  • Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

    代码如下所示: 复制代码 代码如下: package com.hoo.util; import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.util.Random; import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletRequ

  • java实现验证码类生成中文验证码

    复制代码 代码如下: package xwcms.net.service;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;im

  • 解析Java实现随机验证码功能的方法详解

    现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用.验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度.    我们可以使用servlet来实现随机验证码的实现. 复制代码 代码如下: package com.servlet; 

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

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

随机推荐