浏览器改变HTTP标头后发送选项,而不是帖子的(browsers send Options inst

2019-07-31 03:34发布

/*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代码添加到了允许跨域访问,这确实让第一次进入页面加载工作,但是当我尝试做以后POST(含骨干model.save()),浏览器会发送一个选项空实体代替。

它发出正确的POST,如果我没加上面的代码

这发生在Opera,火狐和Chrome(工作正常,如果我开始 - 禁用网络安全镀铬),所以我认为它仍然是一个浏览器的安全问题,任何人都可以提供关于为什么会发生,什么可能是解释修复?

Answer 1:

从什么是HTTP OPTIONS方法?

这种方法允许客户机确定的选项和/或与资源相关联的要求,或者服务器的能力,但这并不意味着资源操作或者启动资源检索。

我曾与CORS问题打了好几次,我一直解决他们尝试和错误我的建议对你的情况的方法是添加OPTIONS到您的允许方法

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

使您的服务器响应OPTIONS与要求* ,在西纳特拉是这样的:

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"


Answer 2:

感谢fguillen的建议,有一定的google搜索,我发现,将工作方式

/*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); 
    } 

所以这是注入在2.0的Restlet CORS不要错过responseHeaders.add正确的代码(“访问控制允许报头”,“内容类型”); 至少当你正在处理的骨干



Answer 3:

稍微偏离主题,但我想这可能是为别人有用,节省时间。
我是有uwsgi服务器和骨干 CORS问题。 这是我uwsgi.ini文件的一部分,这似乎张贴工作。

[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请求。



Answer 4:

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

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");


Answer 5:

也许这个链接可以给你关于CORS是如何工作的,并在其与支持的Restlet一些提示CorsFilter

  • 了解和使用CORS - https://templth.wordpress.com/2014/11/12/understanding-and-using-cors/

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



Answer 6:

在不同的内容的代码下面给出工程的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();
}


文章来源: browsers send Options instead of Post after changing http header