2
/*set the response header*/
    Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
    if (responseHeaders == null) { 
        responseHeaders = new Form(); 
        responseHeaders.add("Access-Control-Allow-Origin", "*");
        responseHeaders.add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
        getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
    } 

我在我的restlet 2.0代码中添加了这个以允许跨域访问,这确实使第一个GET在页面加载时工作,但是当我稍后尝试做POST(使用主干model.save())时,浏览器发送带有a的选项而是空实体。

如果我没有添加上面的代码,它确实会发送正确的 POST

这发生在 Opera、Firefox 和 Chrome 上(如果我用 --disable-web-security 启动 chrome 可以正常工作),所以我认为这仍然是一个浏览器安全问题,谁能解释为什么会发生这种情况以及可能是什么修复?

4

6 回答 6

4

什么是 HTTP OPTIONS 方法?

此方法允许客户端确定与资源相关联的选项和/或要求,或服务器的能力,而无需暗示资源操作或启动资源检索。

我已经与CORS问题进行了多次斗争,并且我总是通过尝试和错误的方法来解决它们,我对您的案例的建议是添加OPTIONS到您的Allow Methods中:

"Access-Control-Allow-Methods": "POST, GET, PUT, DELETE, OPTIONS"

并让您的服务器使用 响应OPTIONS请求*,在 Sinatra 中是这样的:

options "/*" do
  "*"
end

更新

对于关于错误的评论中解释的新问题header field Content-Type is not allowed by Access-Control-Allow-Headers.

尝试添加另一个 CORS 标头:

"Access-Control-Allow-Headers": "origin, x-requested-with, content-type"
于 2012-08-22T09:23:45.583 回答
0

感谢 fguillen 的建议,用谷歌搜索我找到了可行的方法

/*set the response header*/
    Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
    if (responseHeaders == null) { 
        responseHeaders = new Form(); 
        responseHeaders.add("Access-Control-Allow-Origin", "*");
        responseHeaders.add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS"); 
        responseHeaders.add("Access-Control-Allow-Headers", "Content-Type");
        getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
    } 

所以这是在 Restlet 2.0 中为 cors 注入的正确代码,不要错过 responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 至少当你处理骨干时

于 2012-08-22T09:44:36.267 回答
0

稍微偏离主题,但我认为它可能对某人有用并节省时间。
我遇到了uwsgi服务器和骨干网的CORS问题。这是我的 uwsgi.ini 文件的一部分,它似乎适用于 POST。

[uwsgi]
add-header = Access-Control-Allow-Origin: *
add-header = Access-Control-Allow-Headers: origin, x-requested-with, content-type                                                                 
add-header = Access-Control-Allow-Methods: POST,GET,PUT,OPTIONS,DELETE
add-header = Content-Type: application/json; charset=UTF-8
add-header = Accept: application/json

如 fguillen 所述,服务器需要为 OPTIONS 请求回复“*”。

于 2013-11-25T16:44:40.757 回答
0

下面的代码可用于解决 Restlet 2.0 中的跨域问题

Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
if (responseHeaders == null) { 
    responseHeaders = new Form(); 
    getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
} 
responseHeaders.add("Access-Control-Allow-Origin", "*"); 
responseHeaders.add("Access-Control-Allow-Methods", "GET,DELETE,PUT,POST,OPTIONS");
responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
responseHeaders.add("Access-Control-Allow-Credentials", "false"); 
responseHeaders.add("Access-Control-Max-Age", "60");
于 2015-02-27T10:00:21.320 回答
0

也许这个链接可以给你一些关于 CORS 如何工作以及它在 Restlet 中的支持的提示CorsFilter

希望它可以帮助你,蒂埃里

于 2015-02-28T13:48:04.957 回答
0

在不同的内容上,下面给出的代码适用于 Restlet 2.1 以上。

import org.restlet.engine.header.Header;



private static final String HEADERS_KEY = "org.restlet.http.headers";



@SuppressWarnings("unchecked")

static Series<Header> getMessageHeaders(Message message) {

ConcurrentMap<String, Object> attrs = message.getAttributes();

Series<Header> headers = (Series<Header>) attrs.get(HEADERS_KEY);

if (headers == null) {

         headers = new Series<Header>(Header.class);

     Series<Header> prev = (Series<Header>) 

          attrs.putIfAbsent(HEADERS_KEY, headers);

    if (prev != null) { headers = prev; }

     }

   return headers;

}

//The JSON Query "GET"
@Get("json")

 public Representation toJson()

  {

   getMessageHeaders(getResponse()).add("Access-Control-Allow-Origin", "*"); 

   getMessageHeaders(getResponse()).add("Access-Control-Allow-Methods", "POST,GET,OPTIONS");

   getMessageHeaders(getResponse()).add("Access-Control-Allow-Headers", "x-requested-with,Content-Type"); 

   getMessageHeaders(getResponse()).add("Access-Control-Allow-Credentials", "true"); 

   getMessageHeaders(getResponse()).add("Access-Control-Max-Age", "60"); 

  return get();
}
于 2015-03-02T06:13:42.107 回答