zoukankan      html  css  js  c++  java
  • 使用MVC Remote验证

    直接上关键代码:

     public class RegisterModel

    复制代码
    {        
            [Required(ErrorMessage =  " *邮箱地址不能为空 ")] 
            [DataType(DataType.EmailAddress)] 
            [RegularExpression( @" ^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$ ", ErrorMessage =  " *请输入正确的邮箱格式 ")] 
            [ Remote( " IsExistEmail ",  " Validator ",ErrorMessage= " *该邮箱地址已经被注册过 ")] 
              public  string email {  get;  set; }

    ... 

    复制代码
    复制代码
    ///   <summary> 
             ///  验证该EMail账户是否已经被注册过了
             ///   </summary> 
             ///   <param name="email"></param> 
             ///   <returns></returns> 
            
             public JsonResult IsExistEmail( string email) 
            { 
                 bool valid =  false; 
                 if (!AccountServices.IsExistMail(email)) 
                    valid =  true; 
                 
                 return Json(valid,JsonRequestBehavior.AllowGet); 

            }
    复制代码

    前端的代码如下:

    @Html.TextBoxFor(m => m.email) 
    @Html.ValidationMessageFor(m => m.email)

    代码很简单,我想大家都很容易懂,但问题在哪里呢?

    问题就是注册完成后,如果你直接点浏览器后退,就能绕开这个验证机制,因为验证通过这个过程被缓存起来了。

    这样就很容易在后端出现冗余数据,甚至搞乱程序的业务规则,当然健壮的程序会在业务层再次验证是否存在email,存在则抛出异常,但往往这是避免恶意注册和攻击之类的,返回到用户这边是出错页面,非常的不友好。此类问题在注册码等场景上问题更大,明明用户输入的是正确的验证码,由于缓存了之前的,所以怎么输都不对,从而让这些用户流失,所以还是要从本源上去解决:

    解决思路其实很简单:你缓存是吧,我不让你缓存不就行了?ValidatorController中代码如下: 

    复制代码
    using System.Web.UI; 
    ///  < summary > 
            /// 验证该EMail账户是否已经被注册过了 
            ///  </ summary > 
            ///  < param  name ="email" ></ param > 
            ///  < returns ></ returns > 
             [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存 
            public JsonResult IsExistEmail(string email) 
            { 
                bool valid = false; 
                if (!AccountServices.IsExistMail(email)) 
                    valid = true; 
                 
                return Json(valid,JsonRequestBehavior.AllowGet); 
    }
  • 相关阅读:
    女程序员这么少是因为怕秃头?如果你这样想,那就错了...
    使用简单的c#示例的坚实的架构原则
    第1部分设计模式FAQ(培训)
    为什么微软部分类和Java不?
    现实世界四部分类和部分方法的使用
    回到基础:n层ASP的异常管理设计指南。网络应用
    学习c#(第9天):理解c#中的事件(一种见解)
    EventBroker:同步和异步通知组件,松散耦合的事件处理
    潜水在OOP(第一天):多态和继承(早期绑定/编译时多态)
    学习c#(第8天):c#中的索引器(一种实用方法)
  • 原文地址:https://www.cnblogs.com/cylblogs/p/5029175.html
Copyright © 2011-2022 走看看