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); 
    }
  • 相关阅读:
    定时清理日志的shell脚本
    图解 Elestricsearch 写入流程
    消息队列产生严重消息堆积怎么处理?
    消息队列如何确保消息的有序性?
    架构模式 CQRS
    消息队列把消息弄丢了怎么办?
    3 个主流 Java 微服务框架
    RabbitMQ、Kafka、RocketMQ 是如何实现高可用的?
    Kafka 不再需要 ZooKeeper
    微服务设计原则
  • 原文地址:https://www.cnblogs.com/cylblogs/p/5029175.html
Copyright © 2011-2022 走看看