2017-08-09 299 views
2

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

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

'beforeSend'不太可能间歇性失败。请求中缺少某些数据的可能性更大,或者在执行“$ .ajaxSetup”之前进行AJAX调用的可能性更大。 –

+3

@RaviRanjan虽然标题是相同的,但问题和解决方案与这种情况并不相关。 –

+0

@RoryMcCrossan - 我们如何在$ .ajaxsetup之前调用ajax? – rj4u

回答

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); 
      } 
      }); 
相关问题