這實際上是一個比較簡單的問題,但每每挺容易被忽略,此次咱們在推廣咱們的互聯網平臺的時候就吃了這麼一個大虧。 通常用戶註冊過程當中,前端註冊每每會檢驗用戶名、暱稱是否已存在,甚至驗證碼是否匹配,咱們均可以用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);
}
前端的代碼以下:ui
@Html.TextBoxFor(m => m.email)
@Html.ValidationMessageFor(m => m.email)
代碼很簡單,我想你們都很容易懂,但問題在哪裏呢?spa
問題就是註冊完成後,若是你直接點瀏覽器後退,就能繞開這個驗證機制,由於驗證經過這個過程被緩存起來了。code
這樣就很容易在後端出現冗餘數據,甚至搞亂程序的業務規則,固然健壯的程序會在業務層再次驗證是否存在email,存在則拋出異常,但每每這是避免惡意註冊和攻擊之類的,返回到用戶這邊是出錯頁面,很是的不友好。此類問題在註冊碼等場景上問題更大,明明用戶輸入的是正確的驗證碼,因爲緩存了以前的,因此怎麼輸都不對,從而讓這些用戶流失,因此仍是要從本源上去解決:blog
解決思路其實很簡單:你緩存是吧,我不讓你緩存不就好了?ValidatorController中代碼以下: get
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);
}
到此,這個場景下的問題能夠解決,由於想讓你們更從實際場景的思惟方式去考慮問題,寫的有點羅嗦了,請見諒! string