【问题标题】:JavaScript OPTIONS cross-site data sending with FirefoxJavaScript OPTIONS 使用 Firefox 发送跨站数据
【发布时间】:2010-07-21 08:34:41
【问题描述】:

我在使用 Firefox 时将帖子数据发送到服务器时遇到问题。 服务器正在 Google App Engine 上运行。

这是我的 JavaScript 中的内容。

$.ajax({  
    url: 'http://someurl/example/myform.json',  
    type: 'post',  
    dataType: 'json',  
    data: {  
        'value.title': title,  
        'value.info.first': first,  
        'value.info.second': value  
    },
    success: function(data) {  
        alert("success");  
    },  
    error: function(object, status, error) {  
        alert("error");  
    }  
});

在我拥有的服务器上。

@RequestMapping(value = "/myform.json", method = RequestMethod.POST)  
public ResponseEntity<String> create(@ModelAttribute("data") @Valid final Data data,  
final BindingResult result, final HttpServletResponse resp,) {  
  //process Data
}

到目前为止一切顺利,这在 IE 和 Chrome 上运行没有问题。 但是后来我发现它在 Firefox 上不起作用,那是因为浏览器在实际发布任何内容之前首先发送了一个 OPTIONS 方法,所以我继续在我的服务器上进行了以下操作。

@RequestMapping(value = "/form.json", method = RequestMethod.OPTIONS)  
public ResponseEntity<String> options(
  final HttpServletResponse resp) {  
    final HttpHeaders responseHeaders = new HttpHeaders();  
    responseHeaders.set("Access-Control-Allow-Origin", "*");  
    responseHeaders.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");  
    responseHeaders.set("Access-Control-Allow-Headers", "Content-Type");  
    responseHeaders.set("Access-Control-Max-Age", "86400");  
    return new ResponseEntity<String>("",responseHeaders,HttpStatus.OK);  
  }
)

这里的问题是它返回 500 并且日志显示警告。

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)  
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:355)  
at java.security.AccessController.checkPermission(AccessController.java:567)  
at java.lang.SecurityManager.checkPermission(Unknown Source)  
at com.google.apphosting.runtime.security.CustomSecurityManager.checkPermission(CustomSecurityManager.java:45)  
at java.lang.SecurityManager.checkMemberAccess(Unknown Source)  
at java.lang.Class.checkMemberAccess(Unknown Source)  
at java.lang.Class.getDeclaredMethods(Unknown Source)

有什么建议吗?

【问题讨论】:

    标签: java javascript jquery spring firefox


    【解决方案1】:

    在您的 $.ajax 调用中,您可以尝试显式设置 contentType,即:

    $.ajax({
        url: 'http://someurl/example/myform.json',
        type: 'post',
        dataType: 'json',
        contentType: 'application/json',
        data: {
            'value.title': title,
            'value.info.first': first,
            'value.info.second': value
        }, complete: function() {
            alert("done");
        }
    });
    

    我知道我总是通过 x-site 呼叫来执行此操作,并且由于您描述的问题类型已经做了很长一段时间(在服务器上组装呼叫之前需要首先整理选项)。

    如果没有成功,我相信这会让你更上一层楼..

    吉姆

    【讨论】:

    • 感谢您的快速回答。不幸的是,我无法让它工作,它实际上也让 chrome 开始导致 500 条消息。至少可以说令人费解......
    • 嗯 - 不知道那会是什么。包含 $.ajax error: function (i.e. error: function(request, status, error) {...}) 可能是一个想法
    • 经过一些测试,似乎即使服务器日志和篡改数据显示返回的响应为 500,但它会成功:每次运行,返回的数据为空。
    • user397147 - 你不应该使用success: function(data) {...},而不是complete: function() {...} ??.
    • 对不起,我没有更新代码以反映我的更改,我将完成:更改为成功:和错误:每次运行代码时它只返回成功函数跨度>
    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 2012-04-18
    • 2012-06-05
    • 2021-12-27
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多