JAX-RS-CORS只适用于application/xml,不适用于application/json
我遇到了一个奇怪的问题:CORS、XMLHttpRequest和JAX-RS。 我们想在service.myapi.com从mysite.com调用REST-API(Java,JAX-RS) 当我们使用头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
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) {
//...
}