【问题标题】:jQuery Ajax fails when posting data due to keyword in post data由于发布数据中的关键字,jQuery Ajax 在发布数据时失败
【发布时间】:2010-11-17 02:09:47
【问题描述】:

我知道帖子失败的原因,但我不知道如何解决它,也找不到任何其他参考。我将引用 jEditable 以使其更简单,因为它在没有 jEditable 插件的情况下发生。

那么我到底如何“转义”关键字以使其正确发布?以下是相关代码:

测试

<script type="text/javascript">
$(function() {
    $('#button').click(function() {
        $.ajax({
            type : 'POST',
            url : 'ajax/post_cms.php',
            dataType : 'html',
            data : {
                id : '1',
                data : '<p>This is a test of the system that shows me an alert !</p>'
            },
            success : function(data) {
                console.log(data);
            },
            error : function(XMLHttpRequest, textStatus, errorThrown) {
                console.log('An Ajax error was thrown.');
                console.log(XMLHttpRequest);
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
    });
});
</script>

<input type="button" name="button" value="button" id="button" />

当它出错时,它会抛出“error:”回调函数,并且“errorThrown”会被记录为未定义。我很肯定它是“alert”这个词,因为如果我在它出现的一个地方拼写“alert”,那么一切都很好。如果你取出 HTML(所以它只是“数据:'这是一个向我显示警报的系统测试!'”)它工作得很好。

XMLHttpRequest = "XMLHttpRequest readyState=4 状态=0 multipart=false" textStatus = "错误" errorThrown = "未定义"

啊!!救命!!

【问题讨论】:

  • 顺便说一句 - jEditable 在这里找到:appelsiini.net/projects/jeditable
  • 错误的textStatus是什么?
  • console.log(textStatus) 只显示“错误”。我拿出了 jEditable 插件,只是将一些随机数据发布到一个随机页面,如果我包含作品“alert”并且发布数据包含 HTML(即,“

    alert

    ”),那么它以同样的方式炸弹。所以我确定它与 jEditable 无关,而是与 jQuery 相关。除非我做错了什么。

标签: javascript jquery ajax


【解决方案1】:

更新: 问题是防火墙将 AJAX 请求视为 XSS 攻击。如果您遇到类似于以下所示的问题,请务必检查您的环境。

症状:

  1. 发布数据失败,错误代码为 0
  2. 发布数据在其他地方有效,但在您的环境中无效
  3. 发布数据只要不包含任何 javascript 函数就可以工作
  4. 根据文档,您的库似乎没有问题
  5. 您在库中找不到错误。

我认为这里除了 jQuery 之外还有其他问题。 你最初的例子对我来说很好。

在此处查看工作示例:http://jsbin.com/ifami

注意:我必须将您的 ajax URL 更改为有效的 url,否则没有其他更改。

话虽如此,您可以尝试将您的值编码为 URI 组件:

<script type="text/javascript">
$(function() {
        $('#button').click(function() {
                $.ajax({
                        type : 'POST',
                        url : 'ajax/post_cms.php',
                        dataType : 'html',
                        data : {
                                id : '1',
                                data : encodeURIComponent('<p>This is a test of the system that shows me an alert !</p>')
                        },
                        success : function(data) {
                                console.log(data);
                        },
                        error : function(XMLHttpRequest, textStatus, errorThrown) {
                                console.log('An Ajax error was thrown.');
                                console.log(XMLHttpRequest);
                                console.log(textStatus);
                                console.log(errorThrown);
                        }
                });
        });
});
</script>

【讨论】:

  • 那到底是什么鬼?我迷路了。我将 URL 从相对路径更改为绝对路径——没有变化。我下载了最新的 jQuery 库(1.3.2)以确保我正在使用它。当我检查它们时,标题看起来相同。那么服务器配置呢?
  • 但是如果我以上面的例子并将“alert”拼写为“allert”,它就可以正常工作......
  • ajax调用是否支持GET?如果是这样,您可以尝试手动访问该页面以查看他的输出吗?也许不是输入而是导致错误的输出?
  • XMLHttpRequest.responseText 的值是多少?服务器实际上试图返回什么?
  • @coderjoe:post_cms.php 脚本只有一行: print_r($_POST) XMLHttpRequest.responseText 不是有效属性。控制台转储 Firebug 中存在的内容位于问题的底部。
【解决方案2】:

我想也许你的 data: 参数需要另一组括号,像这样:

 data : ({ id : '1',
           data : '<p>This is a test of the system that shows me an alert !</p>'
           }),

【讨论】:

  • @Neil:这是一个绝妙的主意——但不!我尝试了使用和不使用 encodeURIComponent ,但它仍然在我的服务器上失败。但同样,只有当“警报”一词出现时。
【解决方案3】:

如果只有alert这个词,您可以简单地将其更改为其他内容,例如#1234#,然后将其解析回来。这很 hacky,但是如果你输入“alert”就会崩溃的库对我来说听起来很时髦。

您也可以进入 lib 代码并修复它......或者打开一张票让他们修复它。在我看来这是一个非常重要的问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多