首页 > 编程语言 >使用java完成图形验证码

使用java完成图形验证码

时间:2022-09-02 13:22:12浏览次数:70  
标签:code java resp 验证码 import 图形 servlet javax

目标是使用Java生成验证码,传入前端。

一.实现思路

利用接口调用工具类,使用ajax反馈给前端

二.实现步骤

1.添加依赖

点击查看代码
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
    </dependency>

2.编写接口类TestServlet

点击TestServlet的代码
package com.izhicheng;

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.io.IOException;

@WebServlet(urlPatterns = "/verify")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException      {
//        System.out.println(req.getParameter("name"));
        resp.setContentType("application/json;charset=utf-8");
//        resp.getWriter().write("{\"name\":\"1\"}");
       // 写验证码
        VerifyCode code=new VerifyCode();
        System.out.println(code.getCode());
        System.out.println(code.getImg());
        resp.getWriter().write(code.getImg());
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}

3.编写工具类代码

点击查看代码
    package com.izhicheng;

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

  public class VerifyCode {
      private final BufferedImage bufferedImage;
      private String code= "";

      public String getCode() {
          return code;
      }

      public VerifyCode(){
          int height = 40;
          int width = 160;
          bufferedImage=new BufferedImage(width, height,BufferedImage.TYPE_3BYTE_BGR);
          Graphics2D g = bufferedImage.createGraphics();
         // 背景色
          g.setColor(Color.CYAN);
          g.fillRect(0,0, width, height);

          Font font = new Font("",Font.BOLD,23);
          g.setFont(font);
          g.setColor(Color.BLACK);
          g.drawRect(0,0, width -1, height -1);
          Random random=new Random();
          for (int i=1;i<=4;i++){
              String str = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZMNXBCV";
              char c = str.charAt(random.nextInt(str.length()));
              //随机颜色
              g.setColor(new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256)));
              g.drawString(c+"", width /4*i-(width /8),25+random.nextInt(11));
              code += c;
          }

          //干扰线
          for (int i=0;i<10;i++) {
              g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
              int x1 = random.nextInt(width);
              int x2 = random.nextInt(width);
              int y1 = random.nextInt(height);
              int y2 = random.nextInt(height);
              g.drawLine(x1, y1, x2, y2);
             // 干扰噪点;
              int num=20;
              for (int c = 0; c < num; c++) {
                  g.setStroke(new BasicStroke(2F));
                  //设置噪点特征,1.5f噪点的宽度;
                  g.drawOval(x1, y1, 2, 2);
              }

          }

      }

      public String getImg() throws IOException {
          ByteArrayOutputStream stream=new ByteArrayOutputStream();
          ImageIO.write(bufferedImage,"png",stream);
          String base64= Base64.getEncoder().encodeToString(stream.toByteArray());
          stream.flush();
          stream.close();
          return "data:image/png;base64,"+ base64;
      }
  }

4.前端对应代码

点击查看代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

WELCOME MY FRIENDS
<h1>HELLO MY CLASSMATE</h1>
<img id="img" style="width: 160px" height="">

<button><a  href="http://localhost:8080">刷新</a></button>

</body>

三、最终效果

标签:code,java,resp,验证码,import,图形,servlet,javax
From: https://www.cnblogs.com/wengming/p/16649471.html

相关文章

  • JAVA进阶--常用时间API、包装类、正则表达式、Array类、Lambda表达式、常见算法--202
    第一节 Date日期对象1、日期对象如何创建,如何获取时间毫秒值Datedate=newDate();Longtime=date.getTime();2、时间毫秒值怎么恢复成......
  • 《Java编程思想》读书笔记(三)
    前言:三年之前就买了《Java编程思想》这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十一章到第十......
  • 使用IDEA生成JavaDoc文档
    1.选中要生成的包:  2.点击标题栏上得Tools->GenerateJavaDoc...  3.:然后会弹出一个界面,然后在输出目录(Outputdirectory)输入框后面的按钮点击进去选择要保存的......
  • Java表达式转型问题
    1规则计算时,所有char、short、byte类型会转为int型。final修饰的变量不会自动转型,所以final修饰的byte不会自动转为int有一个数是long/float/double,计算结果也是long/f......
  • 如何在 JavaScript 中将 JSON 转换为 CSV
    如何在JavaScript中将JSON转换为CSV下面是我们如何在JavaScript中轻松地将JSON转换为CSV:函数jsonToCsv(项目){constheader=Object.keys(items[0]);常......
  • android原生观察者和被观察者模式java.util.Observable
    项目中用到这个,所以记录一下https://blog.csdn.net/iteye_5649/article/details/82636534?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidula......
  • Java
    面向对象-内部类1.局部内部类1.1格式1.1.1定义格式​ 把类定义在方法中即可publicclassOuter{publicvoidtest(){classInner{//定义了一个......
  • 34 | JAVA集合遍历帮手Iterator(不暴露集合的一种封装)
    IteratorJava的集合类都可以使用foreach循环,List、Set和Queue会迭代每个元素,Map会迭代每个key。以List为例:List<String>list=List.of("Apple","Orange","Pear");f......
  • 35 | JAVA中的Collections(类似C++中的算法)
    CollectionsCollections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。注意Collections结尾多了一个s,不是Collection!我们一......
  • JavaScript 在线课程
    JavaScript在线课程JavaScript(JS)是一种动态的、面向对象的、基于原型的编程语言。它是ECMAScript标准的实现。JS编程语言常用于创建网页脚本,允许客户端(终端用户......