【问题标题】:Ajax beforesend method is not working in some casesAjax beforesend 方法在某些情况下不起作用
【发布时间】:2017-08-09 19:21:03
【问题描述】:

我有一个 tile-standard jsp,它包含在我的应用程序的所有页面中。我试图在应用程序的所有 Ajax 请求中注入一些安全令牌,为此我将以下 sn-p 写入此 JSP 的 head 元素。问题是,在大多数情况下,ajax 调用按预期被拦截,并且令牌被注入数据中。但在某些情况下,不会调用 beforesend 方法,因此请求中不存在令牌。我不知道为什么有些 Ajax 调用没有被截获,而另一些却被截获。 下面是代码 sn-p :

    $(document).ready(function() {
            $.ajaxSetup({
                beforeSend: function(xhr, settings) {
                      var controlId = "<c:out value='${XXXControlIDXXX}' />";

                    // Injecting CSRF token id into data
                       if(controlId!=null) {  
                        var csrfData = {
                            XXXControlIDXXX : controlId                                     
                        }
                        settings.data += "&" + $.param(csrfData);
                       }
                }
            });             
        });

【问题讨论】:

  • beforeSend 间歇性失败的可能性很小。更有可能是请求中缺少某些数据,或者您在执行 $.ajaxSetup 之前进行了 AJAX 调用。
  • @RaviRanjan 虽然标题相同,但问题和解决方案似乎与这种情况无关。
  • @RoryMcCrossan - 我们如何在 $.ajaxsetup 之前进行 ajax 调用?
  • 如果在调用$.ajaxSetup之前调用了任何AJAX方法...
  • 是的,如果 $.ajax 调用在另一个 domready 中,该 domready 定义在持有 $.ajaxSetup 之前。

标签: javascript jquery ajax security csrf-protection


【解决方案1】:

我发现了问题。非常感谢 Rory McCrossan 的投入,使我朝着正确的方向前进。因此,ajax 调用发生在 ajaxsetup 之前,因此我无法设置令牌。我使用了下面的 sn-p,它不依赖于任何文档事件,只是坐在页面上并在所有 ajax 调用上触发。

         $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
           var controlId = "<c:out value='${ControlID}' />";
           if(controlId) {   
             var csrfData = {
                        ControlID : controlId                                       
                    }
             options.data + = "&" + $.param(csrfData);
             }
          });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2018-11-28
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多