网络游戏服务器每一秒会收到大量客户端上传上来的数据请求,而服务器在处理这些数据过程中,会对数据做一个检测来验证它的合法性。
首先写一个接口类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;
}
}
测试代码
有哪些字符在数据库是非法的?知道的请留言!