为什么 jQuery.ajax() 给 url 添加参数?

IT技术 javascript jquery ajax parameters
2021-02-23 11:14:38

我有一个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 */}
    } ,                                                                                                                                                         

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

类型被设置为xml所以不应该有类型的混淆。xml 文件的标题也已适当设置。

我可以从控制台看到 jQuery 抛出错误,但我不确定问题到底出在哪里。

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

谢谢你的帮助!

2个回答

这是一个“缓存破坏者”并且被忽略。

添加的参数更改 url 足以绕过您和源之间的大多数缓存。

如果 URL 未被修改,则数据可能会从您和资源之间的任何一个缓存中提供,包括您的浏览器、任何代理,或许还有服务器本身。

你可以在网上找到很多解释。这是一个

好的,不错。不过,似乎这不是问题。如果文件名中包含 utf-8 字符,我的 ajax 调用将返回 404 - 找不到文件。对此有何想法?
2021-05-05 11:14:38
@FK82-尽管有一些新兴技术可以处理 UTF url,但 http 传统上是 ASCII,因此您需要对任何可能包含 UTF 字符的 url 进行 UrlEncode。btw '?_=1272708280072' 是 ascii 所以这不是问题。
2021-05-11 11:14:38
文件名中的 utf-8 已被准备文件的 java servlet 转义。所以它已经用十六进制编码了%20%20%20(只是一个例子)。因此格式就像filename_%20%20%20.xml. 问题似乎出在 Tomcat 上,因为它用相应的十六进制代码替换了%字符%25因此,我将需要一个用于编码特殊字符的解决方案,该解决方案不会被 Tomcat 解析。我应该能够自己弄清楚。谢谢你的帮助!
2021-05-20 11:14:38

它应该被忽略。

只是为了进行测试,如果您使用的是 rails,请不要使用javascript_include_tag而是通过 JavaScript 作为

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

它不会启用缓存破坏器,因此您可以查看问题是否出在您认为的位置。

缓存破坏者可能是 jQuery 的,因为设置了cache: false标志。问题似乎是另一个问题。如果你喜欢,看看上面的评论。
2021-05-05 11:14:38