酷站(www.ku0.com)-致力于为互联网从业者提供动力!

热门关键词:  企业  as  baidu  c4rp3nt3r  美女
【ECS精选特惠】新用户上云低至1折起
百度资源

java原生动态生成验证码的方法

来源:互联网搜集 作者:秩名 人气: 发布时间:2020-10-12
本篇文章主要介绍了java原生动态生成验证码的方法,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

需求描述: 为了防止脚本多次请求,很多时候在注册会用到验证码,我们用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);
 }
}

new_words.txt文本文件

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

运行效果:

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

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://www.jb51.net/article/197203.htm

相关文章

  • java原生动态生成验证码的方法

    java原生动态生成验证码的方法

    需求描述: 为了防止脚本多次请求,很多时候在注册会用到验证码,我们用java实现 一个图片验证的二维码。 项目结构 只有 标记的这三个文件是用到的 CheckServlet核心代码 package lhw.wanlin.checkimg; import javax.imageio.ImageIO;imp......
    10-12
  • 详解java数组与以逗号分隔开的字符串的相互转换操作

    详解java数组与以逗号分隔开的字符串的相互转换操作

    数组转换成以逗号分隔开的字符串 ? 1 2 3 String[] strArray = {aaa,bbb,ccc}; String str= StringUtils.join(strArry,,); System.out.println(str); String[] strArray = {aaa,bbb,ccc};String str= StringUtils.join(strArry,,);Syst......
    09-23
  • java中throws与throw的区别介绍

    java中throws与throw的区别介绍

    Java中throws和throw的区别讲解 当然,你需要明白异常在Java中式以一个对象来看待。 并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示......
    07-18
  • JAVA观察者模式的讲解

    JAVA观察者模式的讲解

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有......
    06-23
  • Junit写法及与spring整合过程的介绍

    Junit写法及与spring整合过程的介绍

    junit之前的写法: //在Before中注入service类private IUserService userService; @Beforepublic void setUp() throws Exception {//使用xml的方式 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(applica......
    06-20
  • Spring中基于xml的AOP的方法介绍

    Spring中基于xml的AOP的方法介绍

    1、Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术。Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容。是函数式编程的一个衍生范例......
    06-20
  • 使用用java实现分页查询

    使用用java实现分页查询

    1.基本思路 我现阶段的分页查询的实现是基于sql语句的。 select * from user where id limit a, b 构造出相应的a和b就可以查询出想要的数据,在显示在页面上。重点是要构造出当前的页数,就要封装一个javaBean,存储有关分页的基本属性。......
    06-11
  • Java二维数组查找功能的实现代码

    Java二维数组查找功能的实现代码

    题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题目分析: 根据......
    06-11
  • Java规则引擎Easy Rules的使用

    Java规则引擎Easy Rules的使用

    1. Easy Rules 概述 规则引擎就是提供一种可选的计算模型。与通常的命令式模型(由带有条件和循环的命令依次组成)不同,规则引擎基于生产规则系统。这是一组生产规则,每条规则都有一个条件(condition)和一个动作(action) 简单地说......
    06-11
  • Spring Security实现短信验证码登录功能的教程

    Spring Security实现短信验证码登录功能的教程

    开发短信验证码接口 获取验证码 短信验证码的发送获取逻辑和图片验证码类似,这里直接贴出代码。 ? 1 2 3 4 5 6 7 8 9 10 @GetMapping ( /code/sms ) public void createSmsCode(HttpServletRequest request, HttpServletResponse respon......
    05-20

最新更新