/*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(使用backbone model.save())时,浏览器发送改为使用null实体的选项。
如果我没有添加上面的代码,它会发送正确的POST
这种情况发生在Opera,Firefox和Chrome上(如果我用--disable-web-security启动chrome,可以正常工作),所以我认为它仍然是一个浏览器安全问题,任何人都可以解释为什么会发生这种情况,可能是什么修复?
答案 0 :(得分:4)
来自What is the HTTP OPTIONS method?
此方法允许客户端确定与资源相关的选项和/或要求,或服务器的功能,而不会暗示资源操作或启动资源检索。
我已经使用 CORS 问题进行了几次打斗,我总是用尝试和错误的方法解决它们我的建议是你的案例是OPTIONS
到允许方法:
"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"
答案 1 :(得分: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”);至少在你处理骨干的时候
答案 2 :(得分: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请求的'*'。
答案 3 :(得分: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");
答案 4 :(得分:0)
也许这个链接可以通过CorsFilter
为您提供有关CORS如何工作及其在Restlet中的支持的一些提示:
希望它可以帮到你, 亨利
答案 5 :(得分: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();
}