java原生动态生成验证码

本文实例为大家分享了java原生动态生成验证码的具体代码,供大家参考,具体内容如下

需求描述: 为了防止脚本多次请求,很多时候在注册会用到验证码,我们用java实现 一个图片验证的二维码。

项目结构

只有 标记的这三个文件是用到的

CheckServlet核心代码

package lhw.wanlin.checkimg;

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;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@WebServlet(name = "CheckServlet")
public class CheckServlet extends HttpServlet {
 //集中保存所有成语
 private List<String> words = new ArrayList<>();

 @Override
 public void init() throws ServletException {
  // 初始化阶段,读取new_words.txt
  // web工程中读取 文件,必须使用绝对磁盘路径
  String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
  try {
   BufferedReader br = new BufferedReader(new FileReader(path));
   String line;
   while ((line = br.readLine()) != null){
    words.add(line);
   }
   br.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

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

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // 禁止缓存
  // response.setHeader("Cache-Control", "no-cache");
  // response.setHeader("Pragma", "no-cache");
  // response.setDateHeader("Expires", -1);
  System.out.println(words);

  int width = 120;
  int height = 30;

  // 步骤一 绘制一张内存中图片
  BufferedImage bufferedImage = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);

  // 步骤二 图片绘制背景颜色 ---通过绘图对象
  Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
  // 绘制任何图形之前 都必须指定一个颜色
  graphics.setColor(getRandColor(200, 250));
  graphics.fillRect(0, 0, width, height);

  // 步骤三 绘制边框
  graphics.setColor(Color.WHITE);
  graphics.drawRect(0, 0, width - 1, height - 1);

  // 步骤四 四个随机数字
  Graphics2D graphics2d = (Graphics2D) graphics;
  // 设置输出字体
  graphics2d.setFont(new Font("宋体", Font.BOLD, 18));

  Random random = new Random();// 生成随机数
  int index = random.nextInt(words.size());
  String word = words.get(index);// 获得成语

  // 定义x坐标
  int x = 10;
  for (int i = 0; i < word.length(); i++) {
   // 随机颜色
   graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
     .nextInt(110), 20 + random.nextInt(110)));
   // 旋转 -30 --- 30度
   int jiaodu = random.nextInt(60) - 30;
   // 换算弧度
   double theta = jiaodu * Math.PI / 180;

   // 获得字母数字
   char c = word.charAt(i);

   // 将c 输出到图片
   graphics2d.rotate(theta, x, 20);
   graphics2d.drawString(String.valueOf(c), x, 20);
   graphics2d.rotate(-theta, x, 20);
   x += 30;
  }

  // 将验证码内容保存session
  request.getSession().setAttribute("checkcode_session", word);

  // 步骤五 绘制干扰线
  graphics.setColor(getRandColor(160, 200));
  int x1;
  int x2;
  int y1;
  int y2;
  for (int i = 0; i < 30; i++) {
   x1 = random.nextInt(width);
   x2 = random.nextInt(12);
   y1 = random.nextInt(height);
   y2 = random.nextInt(12);
   graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
  }

  // 将上面图片输出到浏览器 ImageIO
  graphics.dispose();// 释放资源

  //将图片写到response.getOutputStream()中
  ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
 }

 /**
  * 取其某一范围的color
  *
  * @param fc
  *   int 范围参数1
  * @param bc
  *   int 范围参数2
  * @return Color
  */
 private 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);
 }
}

web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
   version="4.0">
 <servlet>
  <servlet-name>CheckServlet</servlet-name>
  <servlet-class>lhw.wanlin.checkimg.CheckServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>CheckServlet</servlet-name>
  <url-pattern>/checkServlet</url-pattern>
 </servlet-mapping>
</web-app>

new_words.txt文本文件

一唱一和
一呼百应
一干二净
一举两得
一落千丈

运行效果

这样就动态生成了 图片二维码

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

(0)

相关推荐

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

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

  • Java实现滑动验证码的示例代码

    最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. 接下来分析下滑动验证码的核心流程: 后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 前端实现滑动交互,将抠图拼在抠图阴影之上,获取到用户滑动距离值,比如以下示例 前端将用户滑动距离值传入后端,后端校验误差是否在容许范围内. 这里单纯校验用户滑动距离是最基本的校验,出于更高的安全考

  • 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实现短信验证码5分钟有效时间

    本文实例为大家分享了java实现短信验证码5分钟有效时间,供大家参考,具体内容如下 实现一个发送短信验证码的请求,要求5分钟之内重复请求,返回同一个验证码. 网上可找到几种方案: 如,存储数据库或缓存中.实现起来比较麻烦,舍弃: 另一种方式即本例,使用session存储.其他方式,暂未进一步了解. 实现步骤: (springmvc) 1.controller中,获取session对象,取code,取不到新生成,并存储session中: 2.单手机号发送量,判断并 +1 记入数据库: 3.Time

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

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

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

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

  • Java实现验证码具体代码

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

  • 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实现仿淘宝滑动验证码研究代码详解

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

  • 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

随机推荐