Struts2输入校验剖析之编码方式校验

Struts2 提供了两种校验方式。

使用编码方式进行校验

新建 register.jsp 页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
	<h2 style="color:blue;">用户注册</h2>

	<s:actionerror cssStyle="color:red;" />

	----------------------------------------------------------------------

	<%--
	<form action="register.action">
		username: <input type="text" name="username" size="20" /><br/>
		password: <input type="password" name="password" size="20" /><br/>
		repassword: <input type="password" name="repassword" size="20" /><br/>
		age: <input type="text" name="age" size="20" /><br/>
		birthday: <input type="text" name="birthday" size="20"/><br/>
		geaduation: <input type="text" name="graduation" size="20"/><br/>
	
		<input type="submit" value="submit"/>
	</form>
	 --%>

	<s:fielderror cssStyle="color:blue;"></s:fielderror>
	<s:form action="register" theme="simple">
		username:<s:textfield name="username" label="username"></s:textfield><br/>
		password: <s:password name="password" label="password"></s:password><br/>
		repassword: <s:password name="repassword" label="repassword"></s:password><br/>
		age: <s:textfield name="age" label="age"></s:textfield><br/>
		birthday: <s:textfield name="birthday" label="birthday"></s:textfield><br/>
		geaduation: <s:textfield name="graduation" label="graduation"></s:textfield><br/>
	
		<s:submit value="submit"></s:submit>
	</s:form>

	<%--
	<s:form action="register">
		<s:textfield name="username" label="username"></s:textfield>
		<s:password name="password" label="password"></s:password>
		<s:password name="repassword" label="repassword"></s:password>
		<s:textfield name="age" label="age"></s:textfield>
		<s:textfield name="birthday" label="birthday"></s:textfield>
		<s:textfield name="graduation" label="graduation"></s:textfield>
	
		<s:submit value="submit"></s:submit>
	</s:form>
	--%>
</body>
</html>

Terwer...大约 4 分钟后端开发Struts2方法错误集合校验进行struts2strutscodevalidate
Java生成验证码图片

生成验证码

/**
 * 验证码工具类
 *
 * @name: VerificationCode
 * @author: terwer
 * @date: 2022-07-17 22:21
 **/
public class VerificationCode {
    private static final String[] randomStr = {"0", "1", "2", "3", "4",
            "5", "6", "7", "8", "9", "A", "B",
            "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
            "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z"};

    /**
     * 随机生成验证码
     *
     * @return
     */
    public static Map getVerificationCode() {
        return getVerificationCodeWithStr(null);
    }

    /**
     * 利用给定的字符串生成验证码
     *
     * @param str 指定的字符串
     * @return
     */
    public static Map getVerificationCodeWithStr(String str) {
        // 设置默认生成 4个 长度的验证码
        int strLength = 4;
        char[] strArr = null;
        if (StringUtils.isNotEmpty(str)) {
            strLength = str.length();
            strArr = str.toCharArray();
        }

        // 定义验证码图片大小
        int width = 20 * strLength + 5, height = 25;
        // 在内存中创建 图像
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 为内存中要创建的图像生成画布,
        Graphics2D graphics2D = bufferedImage.createGraphics();
        // 画一个白色矩形,作为验证码背景
        graphics2D.setColor(Color.WHITE);
        // 填充
        graphics2D.fillRect(0, 0, width, height);

        // 画 100 条 灰色的 随机干扰线
        if (StringUtils.isNotEmpty(str)) {
            graphics2D.setColor(Color.WHITE);
        } else {
            graphics2D.setColor(Color.GRAY);
        }
        Random random = new Random();
        for (int i = 0; i < 100; i++) {
            graphics2D.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
        }

        // 创建字体
        Font font = new Font("Times New Roman", Font.BOLD, 25);
        graphics2D.setFont(font);

        StringBuffer sb = new StringBuffer();
        // 取得 4 位数的 随机字符串
        for (int i = 0; i < strLength; i++) {
            // 返回一个 随机数,在 1 和 20 之间
            String randomNumber = randomStr[random.nextInt(36)];
            if (StringUtils.isNotEmpty(str)) {
                randomNumber = String.valueOf(strArr[i]);
            }

            int red = random.nextInt(255);
            int green = random.nextInt(255);
            int blue = random.nextInt(255);
            //获得一个随机红蓝绿的配合颜色
            graphics2D.setColor(new Color(red, green, blue));
            //把该数字用画笔在画布画出,并指定数字的坐标
            if (null != randomNumber) {
                graphics2D.drawString(randomNumber, 20 * i + 5, (height / 2) + 10);
                //把该数字加到缓存字符串中。用于等会生成验证码字符串set到session中用于校对
                sb.append(randomNumber);
            }
        }
        // 清除内存的图片
        bufferedImage.flush();
        // 释放资源
        graphics2D.dispose();

        // 返回结果
        Map result = new HashMap();
        result.put("imgStream", bufferedImage);
        result.put("code", str);
        return result;
    }
}


Terwer...大约 2 分钟经验分享验证码生成字符串随机内存javacode