在某些情况下,Ajax beforesend方法不起作用

时间:2017-08-09 08:47:56

标签: javascript jquery ajax security csrf-protection

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

    $(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);
                       }
                }
            });             
        });

1 个答案:

答案 0 :(得分:0)

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

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