3_32江_0413—随机产生验证码验证码

3_32江_0413—随机产生验证码验证码


引言

首先,通过上节课的学习,我们进行了简单的一个验证码显示固定内容1234并通过命令加入了干扰线,今天我们要实现产生容易的随机的内容的验证码:

1、编写StrUtil类

我们在之前的源码根路径下新建一个工具包utils,并新建一个Java类StrUtil,在其中进行编写代码如下,我们可以看到原理很简单,就是我们通过一个str去存储所有的字符,通过产生随机数和substring方法去去相应位置的数据最后生成一个自定义count的长度的随机字符串。

public class StrUtil {
    public static String randomString(int count) {
        String str = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz";
        StringBuilder stringBuilder = new StringBuilder();
        Random rnd = new Random();
        for (int i = 0; i < count; i++) {
            int pos = rnd.nextInt(str.length());
            String ch = str.substring(pos, pos + 1);
            stringBuilder.append(ch);
        }
        return stringBuilder.toString();
    }
}

2、在原有基础上增加对验证码的判断

首先我们来到CaptcheController类中,在service函数中去生成这个随机字符串,并且生成一张带有随机字符串和干扰信息的图片,代码如下:

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 javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/captche")
public class CaptcheController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletOutputStream sos = resp.getOutputStream();
        String rndStr = StrUtil.randomString(4);
        req.getSession().setAttribute("code",rndStr);
        ImageIO.write(generatePic(100,80,rndStr),"JPEG",sos);
        sos.flush();
        sos.close();
    }
    private BufferedImage  generatePic(int width,int height,String rndStr){
        BufferedImage image = new BufferedImage(100,80,BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0,0,width,height);
        g.setColor(Color.BLACK);
        g.setFont(new Font("宋体",Font.BOLD,30));
        StringBuilder builder = new StringBuilder();
        g.setColor(new Color(rnd.nextInt(255),rnd.nextInt(255), rnd.nextInt(255)));
        g.drawString(rndStr,10,20);  //验证码内容
        for(int j=0,n=rnd.nextInt(100);j<n;j++){   //设置随机点
            g.setColor(Color.RED);
            g.fillRect(rnd.nextInt(width),rnd.nextInt(height),1,1);
        }
        for (int i=0;i<5;i++){
            g.setColor(new Color(rnd.nextInt(255),rnd.nextInt(255), rnd.nextInt(255)));
            int x1=rnd.nextInt(90);
            int y1=rnd.nextInt(30);
            int x2=rnd.nextInt(90);
            int y2=rnd.nextInt(30);
            g.drawLine(x1,y1,x2,y2);
        }
        g.dispose();
        return image;
    }
}

接着,我们回到LoginController类中,我们在原有标签上加入一个图片标签img,并在src值内加入上下文的相对路径去访问我们的生成的验证码图片,并加入对验证码的判断,代码如下:

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;
import java.io.PrintWriter;

@WebServlet("/Login")
public class LoginController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<form action='' method='post'>");
        stringBuilder.append("登录名称:<input type='text' name='LoginName' value=''><br>");
        stringBuilder.append("登录密码:<input type='password' name='LoginPwd' value=''><br>");
        stringBuilder.append("验证码:<input type='text' name='validCode' value=''><br><img src='./captche' width='100' height='60'><br>");
        stringBuilder.append("<input type='reset' name='reset' value='取消'>");
        stringBuilder.append("<input type='submit' name='submit' value='登录'>");
        stringBuilder.append("</form>");
        showMsg(resp, stringBuilder.toString());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String LoginName = req.getParameter("LoginName");
        String LoginPwd = req.getParameter("LoginPwd");
        String validCode = req.getParameter("validCode");
        String code = (String) req.getSession().getAttribute("code");
        String msg;
        if ("35".equals(LoginName) && "1234".equals(LoginPwd) && code.equals(validCode))
        {
            msg = "你好" + LoginName;
        } else {
            msg="账号、密码或验证码错误";
        }
        showMsg(resp,msg);
    }
    private void showMsg(HttpServletResponse resp,String msg)throws IOException{
        resp.setCharacterEncoding("UTF-8");
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<html>");
        stringBuilder.append("<header>");
        stringBuilder.append("<title>text</title>");
        stringBuilder.append("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">");
        stringBuilder.append("<body>");
        stringBuilder.append(msg);
        stringBuilder.append("</body>");
        stringBuilder.append("</html>");
        PrintWriter out=resp.getWriter();
        out.println(stringBuilder.toString());
        out.close();
    }
}

验证

现在我们进行验证成果,假设现在我们的patch=/Project13(上下文),端口为8081,映射为/Login,我们进行localhost(本机地址127.0.0.1)运行代码使用HTTP超文本传输协议访问页面,进入登录页面,进行验证如下图:

1.进入登录界面

在这里插入图片描述

2.只有输入正确账号密码和验证码才可以进入否则提示错误

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值