2020.3.31Java学习笔记

利用java生成带有干扰线的网页验证码图片以及测试源根的初体验

  1. 在java–>controller–>新建CaptcheController类作为今天实验的容器。
  2. 继承HttpServlet类,重写其service方法。
  3. 我把自己需要注意的代码都做了注释,方便自己日后查看。

2020.3.31Java学习笔记_第1张图片
2020.3.31Java学习笔记_第2张图片

package cn.edu.mju.project1.controller;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.IOException;
import java.util.Arrays;
import java.util.Random;

@WebServlet("captche")
public class CaptcheController extends HttpServlet {
    private final int WIDTH = 100;//设置int型常量值,常量值不可更改,名称一般全大写
    private final int HEIGHT= 80;
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedImage img = new BufferedImage(100,80,BufferedImage.TYPE_INT_RGB);//申请内存空间,创建图片对象
        Graphics g =img.getGraphics();//得到画笔对象
        Random r=new Random();//设置一个随机变量
        g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));//获取随机一颜色

        g.fillRect(0,0,WIDTH,HEIGHT);//创建字体,字体的大小应该根据图片的高度来定
        g.setFont(new Font("黑体",Font.BOLD, 18));//字体为黑体,字体加粗,大小为18
        g.setColor(Color.RED);//设置其为红色
        String code = ranString(4);//调用ranString方法,通过更改count数目可以控制其生成个数
        g.drawString(code,10,20);//1.输出内容,2.在哪里输出 code为调用ranString的变量

        for(int i=0;i<12;i++){
            g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
            //画线,干扰线的生成
            g.drawLine(r.nextInt(60), r.nextInt(30), r.nextInt(60), r.nextInt(30));
        }
        g.dispose();//将其合并,图片生成

        ServletOutputStream out = resp.getOutputStream();//输出为二进制数据流(用记事本打开为乱码)
        ImageIO.write(img,"jpg",out);//将图片以jpg格式输出到管道
        try{
        out.flush();//将缓冲区的东西全部刷到out中去,若没有这句话数据传到一半,数据口关闭
        }finally {
            out.close();//关闭
        }
    }
    public String ranString(int count){//定义方法,返回字符串 public对比private 在类外也可以访问
        StringBuilder builder =new StringBuilder();
        String str = "abcdefghijklmnpqrstuvwxy01234567890";//z,o不推荐用,容易和数字0,2混淆
        Random rnd = new Random();//生成随机变量
        for(int i =0;i<count;i++){//可以随机生成4个变量 count为传入的参数
            int pos = rnd.nextInt(str.length());//得到str的位置

            String s = str.substring(pos,pos+1);//0-19,取一个
            builder.append(s);
        }
        return builder.toString();//返回
    }

    }

实验结果

在这里插入图片描述在这里插入图片描述

测试源根

  1. 作用:检验需要上传代码的可用性,提交远程仓库时,不会被提交。
  2. 在目录底下新建test文件,并将其标记为测试源根,否则在其底下无法创建java类。
    .2020.3.31Java学习笔记_第3张图片
import cn.edu.mju.project1.controller.CaptcheController;
import org.junit.Test;

public class TestCaptche {
    @Test
    public void testRandomString(){
        CaptcheController c = new CaptcheController();
        System.out.println(c.ranString(4));
    }
}

这个代码可以测试CaptcheController中的ranString方法。

 public String ranString(int count){//定义方法,返回字符串 public对比private 在类外也可以访问
        StringBuilder builder =new StringBuilder();
        String str = "abcdefghijklmnpqrstuvwxy01234567890";//z,o不推荐用,容易和数字0,2混淆
        Random rnd = new Random();//生成随机变量
        for(int i =0;i<count;i++){//可以随机生成4个变量 count为传入的参数
            int pos = rnd.nextInt(str.length());//得到str的位置

            String s = str.substring(pos,pos+1);//0-19,取一个
            builder.append(s);
        }
        return builder.toString();//返回
    }

点击下面的运行的小绿标即可开始测试
2020.3.31Java学习笔记_第4张图片
成功生成四个随机范围内的字符,测试成功。
2020.3.31Java学习笔记_第5张图片

你可能感兴趣的:(java)