首页 > 编程语言 >Java制作验证码

Java制作验证码

时间:2022-09-04 23:11:49浏览次数:65  
标签:Java java grap 制作 验证码 new import servlet javax

Java制作验证码

一、创建一个maven的web项目

在pom.xml文件中导入maven和tomcat的坐标

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <version>2.2</version>
          </plugin>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>8</source>
                  <target>8</target>
              </configuration>
          </plugin>
      </plugins>
  </build>

二、导入servlet坐标

		<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

三、编写绘画验证码VerofyCode类

package com.lq.zhicheng;

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 VerofyCode {
    private int width = 160;
    private int height = 40;
    private BufferedImage bufferedImage;
    private String code = "";
    private String str = "2345678wertyuiopasdfghjkzxcvnmQWERTYUIOPASDFGHJKLZXCVBNM";


    //用于判断得出的验证码是否和生成的一样
    public String getCode() {
        return code;
    }

    public VerofyCode() {
        //创建图片对象
        bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        //创建画笔对象
        Graphics2D grap = bufferedImage.createGraphics();
        Random random = new Random();
        //设置颜色
        grap.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
        //填充背景色
        grap.fillRect(0, 0, width, height);
        Font font = new Font("", Font.ROMAN_BASELINE, 25);
        grap.setFont(font);
        grap.setColor(Color.black);
        //创建边框
        grap.drawRect(0, 0, width - 1, height - 1);
        //边框颜色
        grap.setColor(Color.black);

        //写字符,随机生成字符
        for (int i = 1; i <= 4; i++) {
            grap.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            int index = random.nextInt(str.length());
            char ch = str.charAt(index);
            grap.drawString(ch + "", width / 5 * i, height / 2);
            code += ch;
        }

        //绘制干扰线,两点确定一线
        for (int i = 0; i < 15; i++) {
            grap.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(height);
            int y1 = random.nextInt(width);
            int y2 = random.nextInt(height);
            grap.drawLine(x1, x2, y1, y2);
        }

    }

    public String getImg() {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        try {
            ImageIO.write(bufferedImage, "png", stream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String base64 = Base64.getEncoder().encodeToString(stream.toByteArray());

        try {
            stream.flush();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "data:image/png;base64," + base64;
    }

}

四、编写TestServlet类且继承HttpServlet类重新doGet、doPost方法。

package com.lq.zhicheng;

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 = "/test")
public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        VerofyCode verofyCode = new VerofyCode();
        System.out.println(verofyCode.getCode());
        System.out.println(verofyCode.getImg());
        resp.setContentType("application/json;charset=utf-8");
        resp.getWriter().write(verofyCode.getImg());
    }

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

五、编写一个简单的前端页面来展示二维码,前端页面用到Vue的双向绑定,通过response反馈到的base64图像数据赋值给模型img中与img中的src进行双向绑定。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <p>验证码</p>
    <img :src="img" alt="" style="width:160px;height: 40px"/>
</div>
</body>
<script src="js/vue.js"></script>
<script src="js/index.js"></script>
<script src="js/axios-0.18.0.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            img: ''
        },
        mounted() {
            //当加载完当前页面后,发送异步请求,获取数据
            this.selectAll()
        },
        methods: {
            selectAll() {
                axios({
                    method: "get",
                    url: "http://localhost:8080/15JavaWs6722/test",
                }).then(response => {
                    console.log(response);
                    this.img = response.data;
                    console.log(this.img);
                })
            }
        }
    })
</script>
</html>

六、展示效果

标签:Java,java,grap,制作,验证码,new,import,servlet,javax
From: https://www.cnblogs.com/HappyLinq/p/16656454.html

相关文章

  • JavaScript 逻辑且(&&)和逻辑或(||)的妙用
    简单运用逻辑且(&&):左右必须都满足true才返回true;逻辑或(||):左右其中一个满足true就返回true。这样简单的运用是整体返回一个布尔值,适合在语句判断的时候用:letus......
  • Java并发编程之synchronized 与 volatile
    synchronized同步代码块一般使用Java的synchronized关键字来实现,有两种方式对方法进行加锁操作;第一处,在方法签名处加synchronized关键字;第二,使用synchronized(对象......
  • Java入门1-安装开发环境
    JDK8的安装1.浏览器搜索JDK8,找到下载地址2.下载电脑对应的版本3.双击安装JDK4.记住安装的路径5.配置环境变量​(1)我的电脑-->右键-->属性-->高级系统设置-->环境......
  • java实现发送邮件功能
    java实现发送邮件功能 <!--发送邮件--><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId>......
  • Java邮件发送中的setRecipient方法使用
    Java邮件发送中的setRecipient方法使用一、方法setRecipient(Message.RecipientTypetype,Addressaddress),是用于设置邮件的接收者。1、有两个参数,第一个参数是接收者的......
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码
    java复制文件的4种方式及拷贝文件到另一个目录下的实例代码这篇文章主要介绍了java复制文件的4种方式,通过实例带给大家介绍了java拷贝文件到另一个目录下的方法,需要的......
  • Java实现文件下载Zip压缩
    Java实现文件下载Zip压缩目录一、概述二、代码功能实现一、概述开发过程中碰到一个需求,需要将服务器上的多个文件打包为zip,并进行下载响应到客户端,写了一个Demo总......
  • java开学测试
    石家庄铁道大学2022年秋季  2021 级课堂测试试卷(一)(15分)课程名称: JAVA语言程序设计  任课教师: 王建民        考试时间: 150 分钟   一、考试要求:1......
  • Java表达式计算工具-Aviator的使用
    Java表达式计算工具-Aviator的使用添加依赖:<!--https://mvnrepository.com/artifact/com.googlecode.aviator/aviator--><dependency><groupId>com.googlecode.......
  • Java集合
    集合java集合分为Collection和Map集合Collecttion接口List元素有序(指的是存储时,与存放顺序保持一致)、可重复的集合Set元素无序、不可重复的集合Map......