话说客户端与服务器端印证

话说客户端与服务器端验证

  今天无意当中看了一位同事写的关于登陆页面的验证,由此引发了我对客户端与服务端验证的一点想法,只是个人一点粗略的见解:

一、客户端验证:对天客户端的验证一般都是通过JS来做的,像下面的这样一段代码

/**
 * 填写用户基本信息
 */
$(document).ready(function() {
    $('#userid').focus();
    // 用户名规则
    jQuery.validator.addMethod("useridRules", function(value, element) {
        return this.optional(element)||/^[a-zA-Z0-9\u4e00-\u9fa5|@|._]+$/.test(value);
    }, "用户名由中文、英文、数字组成!");

    // 密码规则
    jQuery.validator.addMethod("userpwRules", function(value, element) {
        return this.optional(element)||/^[A-Za-z0-9]+$/.test(value);
    }, "密码只能由数字和字母组成!");
    // 校验码长度规则
    jQuery.validator.addMethod("checkCodeLength", function(value, element,param) {
                var length = value.length;
                for (var i = 0; i < value.length; i++) {
                    if (value.charCodeAt(i) > 127) {
                        length++;
                    }
                }
                return this.optional(element)||(length == 4);
            }, "校验码长度为4个字符!");
   

var validator = $("#userinfoForm").validate({
        rules : {
            userid : {
                required : true,
                useridRules : true,
                remote : {
                    data : {
                        userid : function() {
                            return $('#userid').val();
                        }
                    },
                    url : "loginAction!isUserId",
                    type : "post"
                }
            },
            userpw : {
                required : true,
                userpwRules  : true,
                maxlength:50,
                minlength:6
            },
            
            checkCode : {
                required : true,
                checkCodeLength : true,
                minlength:4,
                remote : {
                    data : {
                        checkCode : function() {
                            return $('#checkCode').val();
                        }
                    },
                    url : "loginAction!isCheckCode",
                    type : "post"
                }
            }
          
        },
       messages : {
            userid : {required:"用户名不能为空!",remote : jQuery.format("用户名不存在,请重新输入!")},
            userpw : {required:"密码不能为空!",maxlength:"输入的值在6-50个字符之间!",minlength:"输入的值在6-50个字符之间!"},
            checkCode : {required:"验证码不能为空!",minlength:"校验码长度为4个字符!",maxlength:"校验码长度为4个字符!",remote : jQuery.format("验证码输入错误,请重新输入!")}
        },
        errorPlacement : function(error, element) {
            error.appendTo(element.parent());
        },
        success : function(label) {
            label.html("&nbsp;").addClass("checked");
        },
        
        submitHandler : function(form) {
        form.submit();
          //window.location.href = "loginAction!userLogin?userid=" + $("#userid").val()+"&userpw="+$("#userpw").val()+"&checkCode="+$("#checkCode").val();
            }
            });


});

 在对用户录入的信息都只在客户端进行验证,事实表明这个是很不安全的。一般来说,客户端验证不外乎就是在表单提交前使用VBS或JS等对数据进行过滤,这 对于大部分的用户来说是可行的。一旦用户设置浏览器禁止运行脚本代码,则所有客户端的验证都会失效。因此,强烈建议在编写网页时在客户端和服务器端都要进行数据验证。

二、服务端验证

public void validateUserLogin() {
		if(this.userid==null || "".equals(this.userid.trim())){
			this.addFieldError("userid", "用户名不能为空 !");
		}else{
			if(userid.length() < 6 || userid.length() > 60){
		        this.addFieldError("userid","用户名长度必须为6-60位 !");
			}
			if(!Pattern.compile("^[\u4E00-\u9FA5A-Za-z0-9]+$").matcher(this.userid.trim()).matches()){
				this.addFieldError("userid", "用户名格式不正确 !");
			}
		}
		if(this.userpw==null || "".equals(this.userpw.trim())){
			this.addFieldError("userpw", "密码不能为空 !");
		}else{
			if(userpw.length() < 6 || userpw.length() > 50){
		        this.addFieldError("userpw","密码长度必须为6-50位 !");
			}
			if(!Pattern.compile("^[A-Za-z0-9]+$").matcher(this.userpw.trim()).matches()){
				this.addFieldError("userpw", "密码格式不正确 !");
			}
		}
		if(this.checkCode==null || "".equals(this.checkCode.trim())){
			this.addFieldError("checkCode", "校验码名称不能为空 !");
		}else{
			if(checkCode.length()  != 4){
		        this.addFieldError("checkCode","校验码长度为4位 !");
			}
			if(!Pattern.compile("^[A-Za-z0-9]+$").matcher(this.checkCode.trim()).matches()){
				this.addFieldError("checkCode", "校验码名称不正确 !");
			}
		} 
	}
 

这是一个通过struts2框架来做的一个验证方法,如果说在客户端的JS验证失效或者是被禁掉之后,这个仍然可以起到一个验证的作用。注意:通过这种方法来做的时候要注意,如果要在进入userLogin这个方法之前做验证,哪么这个验证方法的写法就是:validateUserLogin()