Как предотвратить повторную отправку формы в ASP.NET MVC 3? - PullRequest
3 голосов
/ 02 июня 2011

У меня есть бритва, которая отображает HTML-форму и отправляет ее на сервер. Если значения формы правильные, то они сохраняются в базе данных. После вставки я перенаправляю в другое представление, где пользователь может вносить дальнейшие изменения.

Сейчас пользователь может нажать кнопку «Назад» в браузере и повторно отправить форму, чтобы создать еще одну запись в БД.

Как предотвратить повторную отправку в моем приложении MVC?

Ответы [ 4 ]

5 голосов
/ 02 июня 2011

Одним из решений является помещение в форму скрытого поля «токен», которое генерируется случайным образом при загрузке формы.Когда вы видите, что токен возвращается на создание, храните его где-то временно (например, в сеансе, если вы используете сеансы).Если вы снова увидите ту же самую, вы можете предположить, что одна и та же форма была отправлена ​​дважды вместе.

2 голосов
/ 24 сентября 2014

Хотя проверка на стороне клиента возможна, она недостаточно безопасна. Я не уверен, применим ли этот метод к MVC 3, но я реализовал ActionFilterAttribute

вот реализация:

 public class PreventFrequentCallsAttribute : ActionFilterAttribute
 {
    public int DelayRequest = 5;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
            var request = filterContext.HttpContext.Request;      
            var cache = filterContext.HttpContext.Cache;

            var originationInfo = request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? request.UserHostAddress;
            originationInfo += request.UserAgent;
            var targetInfo = request.RawUrl + request.QueryString;
            var hashValue = string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(originationInfo + targetInfo)).Select(s => s.ToString("x2")));

            if (cache[hashValue] != null)
            {    
                filterContext.Controller.ViewData.ModelState.AddModelError("ExcessiveRequests", "Excessive Request Attempts Detected.");                    
            }
            else
            {
                cache.Add(hashValue, originationInfo, null, DateTime.Now.AddSeconds(DelayRequest), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
            }

            base.OnActionExecuting(filterContext);
    }
}

позже, в целевой контроллер, просто добавьте этот атрибут:

    [PreventFrequentCalls(3)]
    public PartialViewResult LogOn(LogOnViewModel model)
2 голосов
/ 25 января 2013

Перенаправить пользователя к другому действию HttpGet после обработки почтового запроса. Так что, когда пользователь обновляет браузер, действие post больше не будет вызываться.

return RedirectToAction ("YourActionMethod");

2 голосов
/ 02 июня 2011

Создайте cookie, чтобы представить эту конкретную страницу, когда она будет успешной.Если он воспроизводится с файлом cookie (который браузер теперь отправляет при каждом запросе), вы знаете, что новая попытка запрещена.

...