<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      samesite


      【譯】MVC3 20個秘方-(15)使用CAPTCHA去防止惡意軟件自動提交評論(防灌水)

      問題

      有種不太幸運的情況,有人用自動程序去提交表單,在整個互聯(lián)網(wǎng)中造成大量的垃圾。為了防止這種情況的方法之一,是使用一個驗證碼---CAPTCHA:全自動區(qū)分計算機和人類的圖靈測試,這迫使用戶把生成的文字輸入到文本框。

      (譯者:CAPTCHA是一種更人性化的驗證碼,可以通過視覺和聽覺來區(qū)分post的請求是人類還是計算機發(fā)出的)

      解決方案

      NuGet安裝ASP.NET Web Helpers Library  從而在BookCommentsController實現(xiàn)防止而已添加書評的功能。 

      討論

      需要安裝一個新的類包,使在表單上應用CAPTCHA成為可能。微軟已經(jīng)創(chuàng)建了一個NuGet web helpers 類包含了CAPTCHA,讓我們很容易實施并且驗證用戶輸入的CAPTCHA。先打開MVC項目,在vs中選擇Tools→LibraryPackage Manager→Add Library Package Reference。點擊左邊的Online,在第一頁的下方您就可以發(fā)現(xiàn) Asp.net web helpers Library。點擊安裝。

      在我們的例子里。那些自動發(fā)送post請求的軟件一般會用在圖書評論上。所以是這里最完美的添加CAPTCHA的地方。在開始之前你必須在RECAPTCHA website為你的域名注冊。(譯者:一般要用一個gmail賬戶。我們使用自己已有的或者重新注冊一個,在這里由于我們的項目是在本機練習使用的,我就為我的localhost注冊)。注冊成功之后你可以得到一個公鑰(public key)和一個私鑰(private key)。

      提示:如果你不使用Ajax去包含CAPTCHA,你可以通過以下兩行代碼改變你的view:

      @using Microsoft.Web.Helpers;
      @ReCaptcha.GetHtml("<你的公鑰>", "<你的私鑰>")

       

      一旦配置完成了,是時候開始更新我們的代碼了。我們需要在BookComments/Index view里做一些小更改。這個view是前一段創(chuàng)建的,用于使用ajax提交書評。這個Ajax需要更新成:當請求完畢,調(diào)用javascript函數(shù)去顯示CAPTCHA按鈕。代碼如下:

      @model IEnumerable<MvcApplication.Models.BookComment>
      @{
      ViewBag.Title = "Index";
      }
      <h2>
      Index</h2>
      <p>
      @Ajax.ActionLink("Create New", "Create", new
      {
      BookId = ViewBag.BookId
      },
      new AjaxOptions { UpdateTargetId = "AddComment" })
      </p>
      <div id="AddComment">
      </div>
      <script type="text/javascript" src=
      "http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"
      >
      </script>
      <script type="text/javascript">
      function DisplayCaptcha() {
      Recaptcha.destroy();
      Recaptcha.create(
      "6Le27coSAAAAAK8KqpUIGvz3qTDXGa9ud9Xst4yY", "captcha", {});//你的公鑰

      }
      </script>
      <table>
      <tr>
      <th>
      Comment
      </th>
      <th>
      Created
      </th>
      </tr>
      @foreach (var item in Model)
      {
      <tr>
      <td>
      @Html.DisplayFor(modelItem => item.Comment)
      </td>
      <td>
      @Html.DisplayFor(modelItem => item.Created)
      </td>
      <td>
      @Html.DisplayFor(modelItem => item.Book.Title)
      </td>
      </tr>
      }
      </table>

      現(xiàn)在,去更新BookComments/create view 。首先添加一個地點去展示CAPTCHA.然后添加一個新的HTML 錯誤消息,當他們輸入錯誤的驗證碼時,會提示錯誤。最后在ReloadComment  javascript 函數(shù)里更改代碼成不自動reload 書評(僅僅當沒錯的時候才reload)。

      @model MvcApplication.Models.BookComment
      @{
      ViewBag.Title = "Create";
      }
      <h2>
      Create</h2>
      @section JavascriptAndCSS {
      <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"
      type
      ="text/javascript"></script>
      <script src="
      @Url.Content("
      ~/Scripts/jquery.validate.unobtrusive.min.js")"
      type
      ="text/javascript"></script>
      }
      <script type="text/javascript">
      function ReloadComments() {
      var reload = "@ViewBag.RefreshComments";
      if (reload == "False") {
      DisplayCaptcha();
      }
      else {
      $(
      "#Comments").load("/BookComments/Index?BookId=@ViewBag.BookId");
      }
      }
      </script>
      @using (Ajax.BeginForm(new AjaxOptions
      {
      UpdateTargetId = "AddComment",
      OnComplete = "ReloadComments"
      }))
      {
      @Html.Hidden("BookId", (int)ViewBag.BookId);
      @Html.ValidationSummary(true)
      <fieldset>
      <legend>BookComment</legend>
      <div class="editor-label">
      @Html.LabelFor(model => model.Comment)
      </div>
      <div class="editor-field">
      @Html.TextAreaFor(model => model.Comment)
      @Html.ValidationMessageFor(model => model.Comment)
      </div>
      <div class="editor-label">
      Are you human?
      </div>
      <div class="editor-field">
      <div id="captcha">
      </div>
      @Html.ValidationMessage("Captcha")
      </div>
      <p>
      <input type="submit" value="Create" />
      </p>
      </fieldset>
      }

      最后我們要更新BookCommentsController 去驗證輸入的CAPTCHA。如果驗證不合法,我們就把錯誤消息添加到ModelState里去,view把它展示出來。

      using System;
      using System.Collections.Generic;
      using System.Data;
      using System.Data.Entity;
      using System.Linq;
      using System.Web;
      using System.Web.Mvc;
      using MvcApplication.Models;
      using Microsoft.Web.Helpers;
      using MvcApplication.Models;
      namespace MvcApplication.Controllers
      {
      public class BookCommentsController : Controller
      {
      private BookDBContext db = new BookDBContext();
      //
      // GET: /BookComments/
      public ActionResult Index(int BookId)
      {
      ViewBag.BookId = BookId;
      var bookcomments = db.BookComments.Include(
      b => b.Book).Where(b => b.BookId == BookId);
      return PartialView(bookcomments.ToList());
      }
      //
      // GET: /BookComments/Create
      public ActionResult Create(int BookId)
      {
      ViewBag.BookId = BookId;
      ViewBag.RefreshComments = false;
      return PartialView();
      }
      //
      // POST: /BookComments/Create
      [HttpPost]
      public ActionResult Create(BookComment bookcomment)
      {
      ViewBag.RefreshComments = false;
      var captchaSuccess = ReCaptcha.Validate(
      "6Le27coSAAAAAM6kZnXU8m1j9");//你的私鑰

      if (ModelState.IsValid && captchaSuccess)
      {
      bookcomment.Created = DateTime.Now;
      db.BookComments.Add(bookcomment);
      db.SaveChanges();
      ViewBag.RefreshComments = true;
      }
      // if captcha failed add error message
      if (!captchaSuccess)
      {
      ModelState.AddModelError("Captcha",
      "Invalid CAPTCHA");
      }
      ViewBag.BookId = bookcomment.BookId;
      return PartialView(bookcomment);
      }
      protected override void Dispose(bool disposing)
      {
      db.Dispose();
      base.Dispose(disposing);
      }
      }
      }

      (譯者:下圖是我實踐之后的截圖,不知道這個CAPTCHA的背景樣式是否能自定義,如果可以的話就太酷了!)

       



      posted @ 2011-12-07 19:42  技術弟弟  閱讀(2781)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 国产四虎永久免费观看| 白丝乳交内射一二三区| 中文成人无字幕乱码精品区| 国产乱码一区二区三区免费| 五月天免费中文字幕av| 国产二区三区不卡免费| 亚洲中文字幕无码爆乳| 97人妻精品一区二区三区| 欧美日韩国产亚洲沙发| 色综合天天综合网天天看片| 无码av岛国片在线播放| 国产精品午夜剧场免费观看| 无遮挡又黄又刺激的视频| 中文字幕亚洲男人的天堂| 国产普通话刺激视频在线播放| 丹凤县| 国产精品人妻久久ai换脸| 中文字幕av一区二区| 且末县| 欧洲无码一区二区三区在线观看| 香蕉久久久久久久AV网站| 黑人巨大无码中文字幕无码| 中文无码精品a∨在线| 丰满爆乳一区二区三区| 性色av免费观看| 精品无码国产污污污免费| CAOPORN免费视频国产| 精品偷拍一区二区三区| 日日摸夜夜添夜夜添国产三级| 久播影院无码中文字幕| 阳春市| 国内精品自线在拍| 五月婷婷久久中文字幕| 久久久久国产一级毛片高清版A | 国产麻豆精品一区一区三区| 又大又粗又爽18禁免费看| 99久久精品国产亚洲精品| 久久亚洲国产精品久久| 久久亚洲色WWW成人男男| 国产精品一区二区久久岳| 国产在线精品一区二区三区直播|