JavaWeb-实用的随机验证码程序

以下是一个随机验证码实用程序:

这里演示生成4个随机的数字的验证码
若要生成含有字母的验证码,参考代码的注释修改代码即可!

package com.carson.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
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.util.Random;

//随机验证码实用程序
public class RandomValidateCodeUtil {


    public static final String RANDOMCODEKEY= "RANDOMVALIDATECODEKEY";//放到session中的作为属性的key值
    private String randString = "0123456789";//随机产生只有数字的字符串 private String
    //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
    //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
    private int width = 95;// 图片宽
    private int height = 25;// 图片高
    private int lineSize = 40;// 干扰线数量
    private int stringNum = 4;// 随机产生字符数量

    private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class);

    private Random random = new Random();

    /**
     * 获得字体
     */
    private Font getFont() {
        return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
    }

    /**
     * 获得颜色
     */
    private Color getRandColor(int fc, int bc) {
        if (fc > 255){
            fc = 255;
        }
        if (bc > 255){
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r, g, b);
    }

    /**
     * 生成随机图片
     */
    public void getRandcode(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillRect(0, 0, width, height);//图片大小
        g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
        g.setColor(getRandColor(110, 133));//字体颜色
        // 绘制干扰线
        for (int i = 0; i <= lineSize; i++) {
            drowLine(g);
        }
        // 绘制随机字符
        String randomString = "";
        for (int i = 1; i <= stringNum; i++) {
            randomString = drowString(g, randomString, i);
        }
        logger.info(randomString);
        System.out.println("生成的随机验证码是:"+randomString);
        //将生成的随机字符串保存到session中
        session.removeAttribute(RANDOMCODEKEY);
        session.setAttribute(RANDOMCODEKEY, randomString);
        g.dispose();
        try {
            // 将内存中的图片通过流动形式输出到客户端
            ImageIO.write(image, "JPEG", response.getOutputStream());
        } catch (Exception e) {
            logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e);
        }

    }

    /**
     * 绘制字符串
     */
    private String drowString(Graphics g, String randomString, int i) {
        g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                .nextInt(121)));
        String rand = String.valueOf(getRandomString(random.nextInt(randString
                .length())));
        randomString += rand;
        g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(rand, 13 * i, 16);
        return randomString;
    }

    /**
     * 绘制干扰线
     */
    private void drowLine(Graphics g) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.drawLine(x, y, x + xl, y + yl);
    }

    /**
     * 获取随机的字符
     */
    public String getRandomString(int num) {
        return String.valueOf(randString.charAt(num));
    }
}

在这里插入图片描述


The End!!创作不易,欢迎点赞/评论!!欢迎关注个人公众号

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个JavaWeb实现随机验证码登录的示例程序: 1. 在JSP页面中添加验证码输入框和验证码图片 ```jsp <form action="loginServlet" method="post"> <label>用户名:</label> <input type="text" name="username" /><br /> <label>密码:</label> <input type="password" name="password" /><br /> <label>验证码:</label> <input type="text" name="verifyCode" /><br /> <img src="verifyCodeServlet" alt="验证码" /> <input type="submit" value="登录" /> </form> ``` 2. 创建生成验证码Servlet ```java public class VerifyCodeServlet extends HttpServlet { private static final String VERIFY_CODES = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static Random random = new Random(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应头信息 response.setContentType("image/jpeg"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 生成验证码图片 int width = 100, height = 30; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); StringBuilder verifyCode = new StringBuilder(); for (int i = 0; i < 4; i++) { verifyCode.append(VERIFY_CODES.charAt(random.nextInt(VERIFY_CODES.length()))); } g.setColor(Color.BLACK); Font font = new Font("Arial", Font.BOLD, 20); g.setFont(font); g.drawString(verifyCode.toString(), 5, 20); g.dispose(); // 将验证码保存到Session中 HttpSession session = request.getSession(); session.setAttribute("verifyCode", verifyCode.toString()); // 将验证码图片输出到客户端 ImageIO.write(image, "JPEG", response.getOutputStream()); } } ``` 3. 创建登录证的Servlet ```java public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取用户输入的信息和验证码 String username = request.getParameter("username"); String password = request.getParameter("password"); String verifyCode = request.getParameter("verifyCode"); // 获取Session中保存的验证码 HttpSession session = request.getSession(); String sessionVerifyCode = (String) session.getAttribute("verifyCode"); // 验证码是否正确 if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) { request.setAttribute("message", "验证码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } else { // 证用户名和密码是否正确 if (username.equals("admin") && password.equals("123456")) { request.setAttribute("message", "登录成功"); request.getRequestDispatcher("/success.jsp").forward(request, response); } else { request.setAttribute("message", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } } } ``` 4. 创建登录成功页面和登录页面 ```jsp <!-- success.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录成功</title> </head> <body> <h1>${message}</h1> </body> </html> ``` ```jsp <!-- login.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <h1>${message}</h1> <form action="loginServlet" method="post"> <label>用户名:</label> <input type="text" name="username" /><br /> <label>密码:</label> <input type="password" name="password" /><br /> <label>验证码:</label> <input type="text" name="verifyCode" /><br /> <img src="verifyCodeServlet" alt="验证码" /> <input type="submit" value="登录" /> </form> </body> </html> ``` 5. 配置Web.xml文件 ```xml <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.example.LoginServlet</servlet-class> </servlet> <servlet> <servlet-name>verifyCodeServlet</servlet-name> <servlet-class>com.example.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>verifyCodeServlet</servlet-name> <url-pattern>/verifyCodeServlet</url-pattern> </servlet-mapping> ``` 以上就是一个JavaWeb实现随机验证码登录的示例程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值