【游戏后端】Java服务器端检测客户端上传来的数据

 网络游戏服务器每一秒会收到大量客户端上传上来的数据请求,而服务器在处理这些数据过程中,会对数据做一个检测来验证它的合法性。

首先写一个接口类IStringValidator,申明方法valid()来判断一个字符串是否是一个合法的字符串。代码如下

package com.lll.util;


/**
 * 字符串格式检查接口。
 * @author liulongling
 *
 */
public interface IStringValidator {
	/**
	 * 检查通过。
	 */
	public static final int OK = 0;
	/**
	 * 超过最大长度限制。
	 */
	public static final int MAX_LIMIT = 1;
	/**
	 * 没到最小长度限制。
	 */
	public static final int MIN_LIMIT = 2;
	/**
	 * 出现非法字符。
	 */
	public static final int ILLEGAL_CHAR = 3;
	/**
	 * 传入参数为空。
	 */
	public static final int NULL = 4;
	/**
	 * 模式不匹配。
	 */
	public static final int ERROR_PATTERN = 5;
	
	/**
	 * 判断一个字符串是否是一个合法的字符串。
	 * @param value 
	 * @return
	 */
	int valid(String value);
}


数字字符串检查器

package com.lll.util;

/**
 *  数字字符串检查器。接受全部是数字的字符串。
 * @author liulongling
 *
 */
public class NumberStringValidator implements IStringValidator {
	public int valid(String value) {
		if (value == null) {
			return IStringValidator.NULL;
		}
		for (int i = 0; i < value.length(); i++) {
			char c = value.charAt(i);
			if (c < '0' || c > '9')
				return IStringValidator.ILLEGAL_CHAR;
		}
		return IStringValidator.OK;
	}
}

测试代码

static void test0()
{
	IStringValidator numberStringValidator = new NumberStringValidator();
	int a = numberStringValidator.valid("222");
	int b = numberStringValidator.valid("你好");
	System.out.println(a);
	System.out.println(b);
}

运行结果

检测通过
出现非法字符


正则表达式模式匹配检查器

手机号验证

package com.lll.util;

import java.util.regex.Pattern;

/**
 * 正则表达式模式匹配检查器。
 * @author liulongling
 *
 */
public class PatternStringValidator implements IStringValidator {
	protected Pattern pattern;

	public PatternStringValidator(String regex) {
		pattern = Pattern.compile(regex);
	}

	public int valid(String value) {
		if (value == null) {
			return IStringValidator.NULL;
		}
		if (pattern.matcher(value).matches()) {
			return IStringValidator.OK;
		}
		return IStringValidator.ERROR_PATTERN;
	}
}

测试代码

static void test1()
	{
		IStringValidator phoneValidator = new PatternStringValidator("^13[0-9]{1}[0-9]{8}|^15[0-9]{1}[0-9]{8}|^18[0-9]{1}[0-9]{8}");
		int a = phoneValidator.valid("13545789823");
		int b = phoneValidator.valid("1354578982");
		int c = phoneValidator.valid("aaaa");
		System.out.println(RESULT[a]);
		System.out.println(RESULT[b]);
		System.out.println(RESULT[c]);
	}


运行结果

检测通过
模式不匹配
模式不匹配


邮箱验证

测试代码

static void test3()
	{
		IStringValidator mailValidator = new PatternStringValidator("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$");
		int a = mailValidator.valid("1805348347@qq.com");
		int b = mailValidator.valid("1805348347qq@.com");
		int c = mailValidator.valid("1805348347@.com");
		System.out.println(RESULT[a]);
		System.out.println(RESULT[b]);
		System.out.println(RESULT[c]);
	}

运行结果

检测通过
模式不匹配
模式不匹配

字符串包含某字符

测试代码

static void test4()
{
		//要求字符串前3位是lll 并且后面4位是数字
		IStringValidator accountNameValidator = new PatternStringValidator("lll[0-9]{4}|lll3[0-9]{4}");
		int a = accountNameValidator.valid("lll1231");
		int b = accountNameValidator.valid("llla222");
		int c = accountNameValidator.valid("我是小毛驴啊");
		System.out.println(RESULT[a]);
		System.out.println(RESULT[b]);
		System.out.println(RESULT[c]);
}

运行结果

检测通过
模式不匹配
模式不匹配

 文字合法性检查器

在游戏里,像玩家,帮派,随从名称,都是需要保存到数据库里的。而其中某些非法字符会导致数据库错误,所以需要过滤。
package com.lll.util;

/**
 * 文字合法性检查器。某些非法字符会导致数据库错误,所以需要过滤。
 * @author liulongling
 */
public class TextValidator implements IStringValidator {
    
    public TextValidator(){
    	
    }
    
	public int valid(String value) {
		if (value == null) {
			return IStringValidator.NULL;
		}
		if (!checkString(value)) {
			return IStringValidator.ILLEGAL_CHAR;
		}
		return IStringValidator.OK;
	}

	private boolean checkString(String s){
        for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            if (!isValidChar(ch)) {
            	return false;
            }
        }
        return true;
    }
    
	private boolean isValidChar(char ch) {
    	if(ch >= 0x20 && ch <= 0x7e){
            return true;
    	}else if(ch >= 0x2018 && ch <= 0x201D){
            return true;
    	}else if(ch == 2026){
            return true;
    	}else if(ch >= 3001 && ch <= 0x3002){
            return true;
    	}else if(ch >= 3008 && ch <= 3011){
            return true;
    	}else if(ch >= 4e00 && ch <= 0x9fa5){
            return true;
    	}else if(ch >= 0xf92c && ch <= 0xfa29){
            return true;
    	}else if(ch >= 0xff01 && ch <= 0xffe5){
            return true;
    	}else if (ch >= 0x0080 && ch <= 0xFFFE) {
    	    return true;
        }
        return false;
    }
}

测试代码


有哪些字符在数据库是非法的?知道的请留言!

测试结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值