Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAX-RS-CORS只适用于application/xml,不适用于application/json_Json_Ajax_Cors_Jax Rs - Fatal编程技术网

JAX-RS-CORS只适用于application/xml,不适用于application/json

JAX-RS-CORS只适用于application/xml,不适用于application/json,json,ajax,cors,jax-rs,Json,Ajax,Cors,Jax Rs,我遇到了一个奇怪的问题:CORS、XMLHttpRequest和JAX-RS。 我们想在service.myapi.com从mysite.com调用REST-API(Java,JAX-RS) 当我们使用头Accept:'application/json' $.ajax({ type: 'POST', url: 'https://service.myapi.com/rest/machine/metadata', headers: { 'Accept': 'app

我遇到了一个奇怪的问题:CORS、XMLHttpRequest和JAX-RS。 我们想在service.myapi.commysite.com调用REST-API(Java,JAX-RS)

当我们使用头
Accept:'application/json'

$.ajax({
    type: 'POST',
    url: 'https://service.myapi.com/rest/machine/metadata',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'Session-Token': myToken
    },
    data: JSON.stringify({
       'machine-number': 1
    })
 });
从浏览器获取以下消息:

已阻止跨源请求:同一源策略不允许读取位于的远程资源。(原因:缺少CORS标头“访问控制允许原点”)

但是,如果我改为接受:'application/xml',它将按预期工作(!)

这就是我在服务器上的样子

添加CORS头的筛选器

处理请求的带有JAX-RS注释的方法


我不知道为什么在使用
Accept:'application/json'
时它不起作用。在Chrome和Firefox中测试。在两种浏览器中获得相同的结果。

这是每个规范的预期行为。如果
内容类型
的值为
application/json
,则不是CORS定义的简单标头,因此触发CORS飞行前请求。请参阅设置了请求的不安全请求标志,并且…在的步骤8中,请求的标头列表中的标头不是简单的标头情况[规范中的主要提取算法唯一不会触发CORS飞行前请求的
内容类型
值是
文本/普通
多部分/表单数据
应用程序/x-www-form-urlencoded
  private static final String ALLOW_HEADERS = createAllowHeaders();

  @Override
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    try {
        chain.doFilter(request, response);
    } catch(Exception e) {
        response.setStatus(500);
    } finally  {
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Expose-Headers","Session-Token");
        response.addHeader("Access-Control-Allow-Headers", ALLOW_HEADERS);
        response.addHeader("Access-Control-Allow-Credentials", "true");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
  }

  private static String createAllowHeaders() {
    return new StringJoiner(", ")
            .add("Access-Control-Allow-Headers")
            .add("X-Requested-With")
            .add("Access-Control-Request-Method")
            .add("Access-Control-Request-Headers")
            .add("origin")
            .add("content-type") 
            .add("accept")
            .add("authorization")
            .add("Session-Token")
            .toString(); 
  } 
@Path("/metadata")
@POST
@Consumes({ APPLICATION_XML, APPLICATION_JSON })
@Produces({ APPLICATION_XML, APPLICATION_JSON })
public Response getMetadata(@Context HttpServletRequest req, MetadataRequest m) {
  //...
}