button单击一次后如何禁用该类的所有链接?我希望能够在一个地方做到这一点,而不必单独改变所有这些......任何想法?
到目前为止我得到了这个:
$("a.button").click(function() { $(this).attr("disabled", "disabled"); });
$("a[disabled]").click(function() { return false; });
Run Code Online (Sandbox Code Playgroud)
但第二个事件没有解雇..
我有一个表格帖子,一直给我一个反伪造令牌错误.
这是我的表格:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.EditorFor(m => m.Email)
@Html.EditorFor(m => m.Birthday)
<p>
<input type="submit" id="Go" value="Go" />
</p>
}
Run Code Online (Sandbox Code Playgroud)
这是我的行动方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Join(JoinViewModel model)
{
//a bunch of stuff here but it doesn't matter because it's not making it here
}
Run Code Online (Sandbox Code Playgroud)
这是web.config中的machineKey:
<system.web>
<machineKey validationKey="mykey" decryptionKey="myotherkey" validation="SHA1" decryption="AES" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
A required anti-forgery token was not supplied or was invalid.
Run Code Online (Sandbox Code Playgroud)
我已经读过,更改HttpContext上的用户会使令牌无效,但这不会发生在这里.我的Join操作上的HttpGet只返回视图:
[HttpGet]
public ActionResult Join()
{
return this.View();
}
Run Code Online (Sandbox Code Playgroud)
所以我不确定发生了什么.我一直在搜索,似乎所有东西都表明它是机器键更改(应用程序周期)或用户/会话更改.
还有什么可以继续?我该如何解决这个问题?
我有以下jQuery代码,以防止双击按钮.它工作正常.我Page_ClientValidate()用来确保只有在页面有效时才会阻止双击.[如果存在验证错误,则不应设置标志,因为没有回发到服务器的启动]
是否有更好的方法可以防止在页面加载之前再次单击按钮?
我们isOperationInProgress = yesIndicator是否可以仅在页面导致回发到服务器时设置标志 ?是否适合event在用户第二次点击按钮之前调用它?
注意:我正在寻找一种不需要任何新API的解决方案
注意:这个问题不重复.在这里,我试图避免使用Page_ClientValidate().此外,我正在寻找一个event我可以移动代码的地方,以便我不需要使用Page_ClientValidate()
注意:我的方案中没有涉及ajax.该ASP.Net表格将被同步提交给服务器.javascript中的按钮单击事件仅用于防止双击.表单提交是使用ASP.Net同步的.
现在的代码
$(document).ready(function () {
var noIndicator = 'No';
var yesIndicator = 'Yes';
var isOperationInProgress = 'No';
$('.applicationButton').click(function (e) {
// Prevent button from double click
var isPageValid = Page_ClientValidate();
if (isPageValid) {
if (isOperationInProgress == noIndicator) {
isOperationInProgress = yesIndicator;
} else {
e.preventDefault();
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
参考文献:
@Peter Ivan在上述参考文献中注意到:
重复调用Page_ClientValidate()可能会导致页面过于突兀(多个警报等).
我想看看Web开发人员如何避免双重提交问题.基本上我对这个问题的理解如下:
当不耐烦的用户多次提交表单时会发生双重提交,从而导致问题.这个问题可以通过JavaScript(特别是jQuery脚本)来修复,这些脚本在提交表单后禁用了提交按钮 - 这样做的一个弱点就是客户端禁用了JavaScript.
还有服务器端检测方法.
所以我的问题是:
人们如何克服双重提交?什么是双重提交引起的问题的真实例子?任何Web应用程序框架都内置了双重提交工具吗?
什么是避免在Spring中重复表单提交的最佳方法.此框架是否提供了处理此问题的任何特殊功能(例如,作为Struts中的Synchronizer Token)?
我想通过AntiforgeryToken属性来保护我们的登录操作- 我知道为什么会出现该主题的异常,但我似乎找不到任何好的解决方案.
假设我们有以下情况:
现在是上午8点,应用程序用户开始工作,他们坐下来开始登录过程 - 现在很可能某些用户将获得相同的ValidationToken.在第一个登录后 - 所有其他人在尝试登录时将看到上述异常(或其他一些自定义异常屏幕).
有些用户登录,然后意外按下" 后退 "按钮并尝试再次登录 - 虽然这种情况不太可能发生,但是我不希望用户看到例外情况.
所以问题很简单 - 如何防止上述情况,或如何处理它们以便用户不会注意到任何事情.我尝试过以下方法:
现在我正在考虑手动验证操作体中的令牌,捕获错误,并检查是否由匿名用户进行了尝试:
public ActionResult SomeAction()
{
try
{
AntiForgery.Validate();
}
catch(HttpAntiForgeryException ex)
{
if(String.IsNullOrEmpty(HttpContext.User.Identity.Name))
{
throw;
}
}
//Rest of action body here
//..
//..
}
Run Code Online (Sandbox Code Playgroud)
以上似乎可以防止错误 - 但它是否安全? 有什么替代品?
提前致谢.
最好的祝福.
编辑:
最终的"解决方案"是在登录表单上禁用令牌验证 - …
我试图通过暂时禁用“提交”按钮并将“提交”按钮的值更改为“正在处理...”来修复双重提交表单,以便用户知道发生了什么。
禁用工作onClick,“提交”值更改为“处理中...”,但是在setTimeout函数结束后,我无法将值更改回“提交” 。
有人知道我该怎么做吗?
$(function() {
$("#submit_btn").click(function() {
$("#submit_btn").attr("disabled", "disabled");
this.value = "Processing...";
setTimeout(function() {
this.value = "Submit"; //<- this line doesn't work
$("#submit_btn").removeAttr("disabled");
}, 5000);
});
});Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="submit_btn" type="submit" value="Submit" />Run Code Online (Sandbox Code Playgroud)
我的页面中有一个提交按钮.有时当我双击它时,双重提交显然,问题是我将信息保存在数据库中,所以我会在那里有重复的信息,我不希望这样.我尝试了一些类似下面的jquery代码,但它对我不起作用.
这里我的按钮标签是:
<input type="submit" id="btnSubmit" class="btn btn-large btn-success" style="padding-right:40px; padding-left:40px; text-align:center;">
Run Code Online (Sandbox Code Playgroud)
jQuery的:
$(document).ready(function()
{
$('#btnSubmit').dblclick(function()
{
$(this).attr('disabled',true);
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
如何进一步处理?防止默认无法正常工作
$(document).ready(function () {
alert("inside click");
$("#btnSubmit").on('dblclick', function (event) {
event.preventDefault();
});
});
Run Code Online (Sandbox Code Playgroud) 听起来像一个简单的问题。我添加了一些jQuery魔术:
$("#edit-save").click(function(event) {
$(this).attr("disabled", "true");
});
Run Code Online (Sandbox Code Playgroud)
但是,一旦到位,就不会调用我的表单提交处理程序。
这是我在hook_menu中定义的路径上的自定义表单:
$items['my_form'] = array(
'title' => 'My form',
'page callback' => 'drupal_get_form',
'page arguments' => array('mymod_myform'),
'type' => MENU_CALLBACK,
);
Run Code Online (Sandbox Code Playgroud)
在表单中,我有一个提交按钮和一个取消按钮:
$form['cancel'] = array(
'#type' => 'submit',
'#value' => t('Cancel'),
);
$form['save'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
Run Code Online (Sandbox Code Playgroud)
我定义了自己的提交处理程序:
$form['#submit'][] = 'mymod_myform_submit';
Run Code Online (Sandbox Code Playgroud)
我在drupal_get_form()函数中放置了一些跟踪代码,以在提交表单时嗅探$ _POST变量。禁用jQuery magic时,$ _POST变量包含一个“ op”参数:
Array
(
[op] = Save
[form_build_id] => form-6e74c87390e3fc48d0bebd2f5193315b
[form_token] => 33db6e34c0350e33c48861a63a38d45f
[form_id] => dh_seo_workload_item_form
)
Run Code Online (Sandbox Code Playgroud)
但是,如果我启用了jQuery Magic,可以在单击后禁用提交按钮,则$ _POST数组中将不再包含“ op”参数,因此Drupal认为该表单尚未提交。
根据 ASP.Net Core docs,会话状态的行为已经改变,因为它现在是非锁定的:
会话状态是非锁定的。如果两个请求同时尝试修改会话的内容,最后一个请求会覆盖第一个请求。Session 是作为一个连贯的 session 来实现的,这意味着所有的内容都存储在一起。当两个请求试图修改不同的会话值时,最后一个请求可能会覆盖第一个请求所做的会话更改。
我的理解是,这与 .Net Framework 中会话的行为不同,其中用户的会话根据请求被锁定,因此无论何时读取/写入它,您都不会覆盖另一个请求的数据或读取过时的数据,对于该用户。
我的问题:
有没有办法在 .Net Core 中重新启用用户会话的每个请求锁定?
如果没有,是否有可靠的方法来使用会话来防止给定用户重复提交数据?举一个具体的例子,我们有一个支付流程,该流程涉及用户从外部托管的 ThreeDSecure (3DS) iFrame(支付卡安全流程)返回。我们注意到有时(以某种方式)用户在 iFrame 中多次提交表单,我们无法控制。因此,这会触发对我们应用程序的多个回调。在我们之前的 .Net Framework 应用程序中,我们使用会话来指示付款是否正在进行中。如果在会话中设置了此标志并且您再次点击 3DS 回调,应用程序将阻止您继续。然而,现在似乎因为会话没有被锁定,当这些几乎同时发生的重复回调发生时,线程 'A' 设置 '
既然会话的工作方式发生了变化,那么处理访问同一会话的同时请求有哪些好方法?
jquery ×5
javascript ×3
.net ×1
.net-core ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
button ×1
c# ×1
drupal ×1
drupal-fapi ×1
form-submit ×1
forms ×1
html ×1
spring ×1
spring-mvc ×1