2021-09-23

java画布验证码

1.java代码:

package com.xmx.util;

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

/**
 * @Auther: 郑兴源
 * @DateTime :  2021-11-22 上午 09:53
 * @descriptoin:
 */
@WebServlet("/resultNub")
public class ResultNubUtil extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //1  在内内存中申请 一块画布
        BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_BGR);
        //2 得到画布笔
        Graphics g = image.getGraphics();
        //3设置颜色
        g.setColor(new Color(255, 255, 255));
        //4设置背景颜色
        g.fillRect(0, 0, 80, 30);
        //5给画笔设置颜色
        Random r = new Random();
        g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
        //6设置字符
        g.setFont(new Font(null, Font.ITALIC, 24));
        //7定义一个随即数组
        char[] cc = {
    
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
        //8验证码的随机
        String number = "";
        for (int i = 0; i < 5; i++) {
    
    
            number += String.valueOf(cc[r.nextInt(cc.length)]);
        }

        //存验证码在服务器
        HttpSession session = req.getSession();
        session.setAttribute("trueyzm", number);//用于与表单德剧比较


        //9画在背景上
        g.drawString(number, 5, 26);
        //10.1划线干扰
        for (int i = 0; i < 7; i++) {
    
    
            g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
            // 10.2画线
            g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(30));
        }
        /**
         * 压缩图片  输出
         */
        resp.setContentType("image/jpeg");
        // 获取输出流
        OutputStream os = resp.getOutputStream();
        // 用流写出
        javax.imageio.ImageIO.write(image, "jpeg", os);
        os.close();
    }
}

验证码效果:

验证码

2.html前端

<form class="form-signin" id="path" method="post">
    <h2 class="form-signin-heading" style="text-align: center; color: darkorchid;">登入界面</h2>
    </br>
    <p>账户<input type="text" name="userid" id="inputEmail" class="form-control" placeholder="请输入账号" required
                autofocus></p>
    <p>密码<input type="password" name="userpwd" id="inputPassword" class="form-control" placeholder="请输入账号密码"
                required></p>
    <p>验证: <input type="text" class="inputgri" name="number"/>

        <img id="num" src="resultNub"><a
            href="javascript:" onclick="document.getElementById('num').src = 'resultNub?'+(new Date()).getTime()">看不清</a>
    </p>
    <div class="checkbox">
        <label>
            <input type="checkbox" value="remember-me"> 记住密码
            <select id="type">
                <option value="0">请选登入用户类型</option>
                <option value="1">用户</option>
                <option value="2" selected>管理员</option>
            </select>
        </label>
    </div>
    <!--        type="submit"-->
    <button class="btn btn-lg btn-primary btn-block" onclick="getPath()">Sign in</button>
</form>

注意:

   <p>验证: <input type="text" class="inputgri" name="number"/>
           <img id="num" src="resultNub">
           <a href="javascript:" onclick="document.getElementById('num').src = 'resultNub?'+(new Date()).getTime()">看不清</a>
  </p>

img 的src 是 httpservlet 的路径(这里是:@WebServlet("/resultNub"))
用来切换图片(得加一个时间):οnclick="document.getElementById(‘num’).src = ‘resultNub?’+(new Date()).getTime()

3.servlet:处理

package com.xmx.util;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Auther: 
 * @DateTime :  2021-11-22 上午 10:55
 * @descriptoin:
 */

public class Login extends HttpServlet {
    
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
       
        String name = req.getParameter("userid");
        String pwd = req.getParameter("userpwd");
        //验证码
        String number = req.getParameter("number").trim();
        System.out.println(number);
        HttpSession session = req.getSession();
        // session.setAttribute("name", name);
        String trueyzm = session.getAttribute("trueyzm").toString();
        System.out.println("Getsession:" + trueyzm);
        // if (number.equalsIgnoreCase(trueyzm) && service.adminLogin(name, pwd) > 0)
        if (number.equalsIgnoreCase(trueyzm) ) {
    
    //忽略大小写
            System.out.println("管理员登入成功.....");
            resp.sendRedirect("/fitness/adminMenu.html");
            // req.getRequestDispatcher("/fitness/fitness/admin/adminMenu.html").forward(req, resp);
        } else {
    
    
            System.out.println("管理员登入失败.....");
            resp.sendRedirect("/fitness/index.html");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_45256755/article/details/120434694