1. package com.oracle;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.Graphics2D;
  7. import java.awt.image.BufferedImage;
  8. import java.io.BufferedReader;
  9. import java.io.FileReader;
  10. import java.io.IOException;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Random;
  14.  
  15. import javax.imageio.ImageIO;
  16. import javax.servlet.ServletException;
  17. import javax.servlet.http.HttpServlet;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20.  
  21. /**
  22. * 验证码生成程序
  23. *
  24. *
  25. *
  26. */
  27. public class CheckImgServlet extends HttpServlet {
  28.  
  29. // 集合中保存所有成语
  30. private List<String> words = new ArrayList<String>();
  31.  
  32. @Override
  33. public void init() throws ServletException {
  34. // 初始化阶段,读取new_words.txt
  35. // web工程中读取 文件,必须使用绝对磁盘路径
  36. String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
  37. try {
  38. BufferedReader reader = new BufferedReader(new FileReader(path));
  39. String line;
  40. while ((line = reader.readLine()) != null) {
  41. words.add(line);
  42. }
  43. reader.close();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. public void doGet(HttpServletRequest request, HttpServletResponse response)
  50. throws ServletException, IOException {
  51. // 禁止缓存
  52. // response.setHeader("Cache-Control", "no-cache");
  53. // response.setHeader("Pragma", "no-cache");
  54. // response.setDateHeader("Expires", -1);
  55.  
  56. int width = 120;
  57. int height = 30;
  58.  
  59. // 步骤一 绘制一张内存中图片
  60. BufferedImage bufferedImage = new BufferedImage(width, height,
  61. BufferedImage.TYPE_INT_RGB);
  62.  
  63. // 步骤二 图片绘制背景颜色 ---通过绘图对象
  64. Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
  65. // 绘制任何图形之前 都必须指定一个颜色
  66. graphics.setColor(getRandColor(200, 250));
  67. graphics.fillRect(0, 0, width, height);
  68.  
  69. // 步骤三 绘制边框
  70. graphics.setColor(Color.WHITE);
  71. graphics.drawRect(0, 0, width - 1, height - 1);
  72.  
  73. // 步骤四 四个随机数字
  74. Graphics2D graphics2d = (Graphics2D) graphics;
  75. // 设置输出字体
  76. graphics2d.setFont(new Font("宋体", Font.BOLD, 18));
  77.  
  78. Random random = new Random();// 生成随机数
  79. int index = random.nextInt(words.size());
  80. String word = words.get(index);// 获得成语
  81.  
  82. // 定义x坐标
  83. int x = 10;
  84. for (int i = 0; i < word.length(); i++) {
  85. // 随机颜色
  86. graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
  87. .nextInt(110), 20 + random.nextInt(110)));
  88. // 旋转 -30 --- 30度
  89. int jiaodu = random.nextInt(60) - 30;
  90. // 换算弧度
  91. double theta = jiaodu * Math.PI / 180;
  92.  
  93. // 获得字母数字
  94. char c = word.charAt(i);
  95.  
  96. // 将c 输出到图片
  97. graphics2d.rotate(theta, x, 20);
  98. graphics2d.drawString(String.valueOf(c), x, 20);
  99. graphics2d.rotate(-theta, x, 20);
  100. x += 30;
  101. }
  102.  
  103. // 将验证码内容保存session
  104. request.getSession().setAttribute("checkcode_session", word);
  105.  
  106. // 步骤五 绘制干扰线
  107. graphics.setColor(getRandColor(160, 200));
  108. int x1;
  109. int x2;
  110. int y1;
  111. int y2;
  112. for (int i = 0; i < 30; i++) {
  113. x1 = random.nextInt(width);
  114. x2 = random.nextInt(12);
  115. y1 = random.nextInt(height);
  116. y2 = random.nextInt(12);
  117. graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
  118. }
  119.  
  120. // 将上面图片输出到浏览器 ImageIO
  121. graphics.dispose();// 释放资源
  122.  
  123. //将图片写到response.getOutputStream()中
  124. ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
  125.  
  126. }
  127.  
  128. public void doPost(HttpServletRequest request, HttpServletResponse response)
  129. throws ServletException, IOException {
  130. doGet(request, response);
  131. }
  132.  
  133. /**
  134. * 取其某一范围的color
  135. *
  136. * @param fc
  137. * int 范围参数1
  138. * @param bc
  139. * int 范围参数2
  140. * @return Color
  141. */
  142. private Color getRandColor(int fc, int bc) {
  143. // 取其随机颜色
  144. Random random = new Random();
  145. if (fc > 255) {
  146. fc = 255;
  147. }
  148. if (bc > 255) {
  149. bc = 255;
  150. }
  151. int r = fc + random.nextInt(bc - fc);
  152. int g = fc + random.nextInt(bc - fc);
  153. int b = fc + random.nextInt(bc - fc);
  154. return new Color(r, g, b);
  155. }
  156.  
  157. }
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. <script type="text/javascript">
  9. function code(node){
  10. node.src="/WEB0/CheckImgServlet?time="+new Date().getTime();
  11. }
  12. </script>
  13. </head>
  14. <body>
  15. <img src="/WEB0/CheckImgServlet" onclick="code(this)"><br>
  16. 请输入验证码:<input type="text" name="pwd">
  17. </body>
  18. </html>

JAVA基础之设置随机成语验证码的更多相关文章

  1. java基础69 JavaScript产生伪验证码(网页知识)

    1.伪验证码 <!doctype html> //软件版本:DW2018版 <html> <head> <meta charset="utf-8&q ...

  2. java随机生成验证码

    package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...

  3. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  4. [改善Java代码]不要随便设置随机种子

    建议30: 不要随便设置随机种子 随机数在太多的地方使用了,比如加密.混淆数据等,我们使用随机数是期望获得一个唯一的.不可仿造的数字,以避免产生相同的业务数据造成混乱.在Java项目中通常是通过Mat ...

  5. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  6. java基础---->验证码的使用(一)

    验证码是一种区分用户是计算机和人的公共全自动程序.可以防止:恶意破解密码.刷票.论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通 ...

  7. 如何利用随机数产生验证码(java基础知识)

    以前我们通用的验证码都是五个不同的大小写字母,那么今天我就带大家学习一下利用Java基础怎么生成验证码.首先我们应该有一个清晰的思路:首先定义一个固定长度的数组用来存储需要生成的字母:其次生成随机数, ...

  8. (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  9. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

随机推荐

  1. docker run 中的privileged参数

    docker 应用容器 获取宿主机root权限(特殊权限-) docker run -d --name="centos7" --privileged=true centos:7 / ...

  2. windows如何删除服务

    有时候软件被安装成了服务,但是卸载后如何删除无效的服务,这时候就不是普通用户就能删除了,这属于操作系统管理级别了,需要使用管理命令了. 管理员权限打开cmd,执行如下: C:\Windows\syst ...

  3. vmware vsphere各版本差别,及各套件差别

    最近要开始全面支持虚拟化了,客户私有云环境用的多的为vmware vsphere,特地恶补下vmware vsphere的各个差别. 首先是vSphere,ESXi和vCenter 的区别. ESXi ...

  4. linux压缩 zip和unzip

    .把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 .把/home目录下面的mydata.zip解压到myda ...

  5. Visual Assist之Hashtags功能简介

    Visual Assist是一款非常好的Visual Studio下开发的插件,网上已经有很多关于它的配置以及相关介绍,本文不再赘述.本文将注重介绍它的Hashtags功能. 本文主要内容来自于官网介 ...

  6. 深入浅出依赖注入容器——Autofac

    1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...

  7. golang中defer的正确使用方式(源自深入解析go)

    3.4 defer关键字 defer和go一样都是Go语言提供的关键字.defer用于资源的释放,会在函数返回之前进行调用.一般采用如下模式: f,err := os.Open(filename) i ...

  8. 【tensorflow-v2.0】如何查看模型的输入输出流的属性

    操作过程: 1. 查看mobilenet的variables loaded = tf.saved_model.load('mobilenet') print('MobileNet has {} tra ...

  9. window 10 U盘启动制作教程

    微软win10工具下载链接https://www.microsoft.com/zh-cn/software-download/windows10?OCID=WIP_r_Win10_Body_AddPC ...

  10. SpringBoot小技巧:统一异常处理

    SpringBoot小技巧:统一异常处理 情景描述 对于接口的定义,我们通常会有一个固定的格式,比如: 但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格 ...