为什么jQuery.ajax()会在url中添加参数?

15

我有一个数据获取方法,它使用jQuery.ajax()来获取xml文件。

/*    */data: function() {                                                                                                                                          
                                                                                                                                                                /* debug */try {
        var url = arguments[0] ;                                                                                                                                
        var type = arguments[1] ;                                                                                                                               
        var scope = arguments[2] ;                                                                                                                              
        var callback = arguments[3] ;                                                                                                                           

        var self = this ;                                                                                                                                       
            if(this.cache[url]) {                                                                                                                               
                callback(this.cache[url]) ;                                                                                                                     
            } else if(!this.cache[url]) {                                                                                                                       

                $.ajax({                                                                                                                                        
                    type: "GET" ,                                                                                                                               
                    url: url ,                                                                                                                                  
                    dataType: type ,                                                                                                                            
                    cache: false ,                                                                                                                              
                    success: function(data) {                                                                                                                   

                            if(type == "text/xml") {                                                                                                                                                                                                                                                                                
                                var myJson = AUX.json ;                                                                                                         
                                var jsonString = myJson.build(data,scope,null) ;                                                                                
                                var jsonObject = $.parseJSON(jsonString) ;                                                                                      
                                self.cache[url] = jsonObject ;                                                                                                  
                                callback(url) ;                                                                                                                 

                            } else if(type == "json") {                                                                                                         

                                self.cache[url] = data ;                                                                                                        
                                callback(url) ;                                                                                                                 

                            }                                                                                                                                   

                    } ,                                                                                                                                         
                    error: function() {                                                                                                                         
                        throw "Ajax call failed." ;                                                                                                             
                    }                                                                                                                                           
                }) ;                                                                                                                                            

            }                                                                                                                                                   
                                                                                                                                                                /* debug */} catch(e) {
                                                                                                                                                                /* debug */     alert("- caller: signTutor.data\n- " + e) ;
                                                                                                                                                                /* debug */}
    } ,                                                                                                                                                         

我的问题是:如果文件名中存在ASCII范围之外的转义(十六进制表示)或未转义的UTF-8字符,jQuery会在URL中添加一个参数(?_=1272708280072)。如果文件名中不包含该范围内的字符,则一切正常。

类型被设置为xml,因此不应该混淆类型。XML文件的头信息也已适当设置。

我可以从控制台看到jQuery抛出了一个错误,但我不确定问题真正所在。

可能是文件名格式的问题,但我没有找到有关AJAX文件名规范的任何资源。有什么想法吗?

谢谢您的帮助!

2个回答

23

这是一个“缓存破坏器”,会被忽略。

添加的参数足以改变URL,绕过大多数你和源之间的缓存,包括浏览器、代理和服务器本身等资源之间的任何一个缓存,确保从原始地址获取数据。

在网络上可以找到很多解释。这里有一个


好的,很棒。看起来那不是问题所在。如果文件名中有UTF-8字符,我的ajax调用会返回404 - 文件未找到。对此有什么想法吗? - FK82
@FK82- 尽管有一些新兴技术可以处理UTF URL,但HTTP传统上是ASCII,因此您需要对可能包含UTF字符的任何URL进行UrlEncode。顺便说一句,'?_=1272708280072'是ASCII,所以那不是问题。 - Sky Sanders
文件名中的utf-8已经被Java Servlet转义,准备文件时进行了编码,因此它已经以十六进制编码的形式出现,例如%20%20%20。因此格式类似于filename_%20%20%20.xml。问题似乎出在Tomcat上,因为它将%字符替换为相应的十六进制编码%25。因此,我需要一种特殊字符编码的解决方案,不会被Tomcat解析。我应该能够自己找到解决方法。感谢您的帮助! - FK82

1

它应该被忽略。

只是为了进行测试,如果你正在使用Rails,请不要使用javascript_include_tag,而是将JavaScript直接传递给

<script src="/path/for/the/script/script.js" type="text/javascript"></script> 

它不会启用缓存破坏器,这样您就可以看到问题是否出现在您认为的位置。


2
缓存破坏器可能是jQuery的,因为它设置了“cache:false”标志。但问题似乎是另一个问题。如果您愿意,请查看上面的评论。 - FK82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接