Adobe CQ 中托管的休息服务的 CORS 问题
CORS issue with rest service hosted in Adobe CQ
我们在 Adobe CQ 中托管的 rest 服务存在 CORS 问题(请注意,这只是一个概念验证应用程序)。为了解决这个问题,我们添加了一个简单的过滤器来设置所需的响应 headers。
过滤器的代码类似于
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
if (request instanceof SlingHttpServletRequest
&& response instanceof SlingHttpServletResponse) {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
slingResponse.addHeader("Access-control-Allow-Origin", "*");
slingResponse.addHeader("Access-control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
slingResponse.addHeader("Access-Control-Allow-Headers", "Content-Type");
filterChain.doFilter(slingRequest, slingResponse);
}
我们正在使用 Jquery 脚本向 CQ 服务发出 GET 请求,以获取 Jercy (MOXY) 生成的一些 JSON 值。
$(function(){
$("#getPerson").on("click", function(){
$.ajax({
url: "http://san.dev.local.com:4502/services/person/get",
type: "GET", crossDomain: true,
contentType: "application/json",
cache: false,
dataType: "json",
success: function (data) {
alert('success');
if($.trim(data) == "false") {
alert("Fail to recive");
}
else {
alert("Successfully data recived");
}
} ,error : function(err){
console.log(err);
alert("Error : "+err);
//YOUR CODE FOR AJAX FAILURE
}
});
});
});
[但是 ajax 请求的接受 header 显示 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8]" 这样可以吗?]
注意:我们的 service/Resource 被注释为
@Path("/get")
@GET
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON,MediaType.TEXT_XML})
public Person getPerson() {
.......................
.......................
}
但是每当我们发送 AJAX 请求来获取人员数据时,我们都会收到 CORS 错误
04:46:47.497 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the
remote resource at http://san.dev.local.com:4502/services/person/get?_=1442467869174.
(Reason: CORS request failed).1 <unknown>
注:
我们使用拦截代理来检查请求和响应 (OWASP ZAP)。
要求
OPTIONS http://san.dev.local.com:4502/services/person /get?_=1442467869171 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Origin: http://san.dev.local.com:8080
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
Host: san.dev.local.com:4502
回应
HTTP/1.1 200 OK
Connection: Keep-Alive
Server: Day-Servlet-Engine/4.1.52
Content-Type: text/html
Content-Length: 0
Date: Thu, 17 Sep 2015 05:32:24 GMT
Allow: GET,OPTIONS,HEAD
令人惊讶的是,响应 header
Access-control-Allow-Origin
响应中缺少。
非常感谢任何解决此问题的建议。
更新
对我来说,似乎是某个或其他过滤器覆盖了我们的设置。如果是这样,有没有办法处理这种情况。
刚才我们发现了这个 post : Java filter failing to set response headers。
通过添加服务排名修改了过滤器属性 属性 以保持过滤器在可能的堆栈中。
@Properties({ @Property(name = "filter.scope", label = "scope", value = "REQUEST"),
@Property(name = "filter.order", label = "order", value = "2"),
@Property(name = "service.ranking", intValue = 1)})
但这对我们也没有帮助。任何指点都会对我们有所帮助。
提前致谢,
桑
您已经知道收到 CORS 错误的原因是因为您的响应 header 中没有 Access-Control-Allow-Origin:* 值。在您的过滤器 servlet 中,您是否尝试过指定特定域(例如 http://san.dev.local.com:8080)?
您也可以尝试创建一个常规 servlet 并查看是否返回了 header。
应该链接过滤。也许添加一个自定义响应 header 值 (myvar: success) 以确保它从您的过滤器返回。您始终可以连接调试器以查看调用堆栈的样子,并可能找出正在使用的其他过滤器。
我们在 Adobe CQ 中托管的 rest 服务存在 CORS 问题(请注意,这只是一个概念验证应用程序)。为了解决这个问题,我们添加了一个简单的过滤器来设置所需的响应 headers。 过滤器的代码类似于
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
if (request instanceof SlingHttpServletRequest
&& response instanceof SlingHttpServletResponse) {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
slingResponse.addHeader("Access-control-Allow-Origin", "*");
slingResponse.addHeader("Access-control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS");
slingResponse.addHeader("Access-Control-Allow-Headers", "Content-Type");
filterChain.doFilter(slingRequest, slingResponse);
}
我们正在使用 Jquery 脚本向 CQ 服务发出 GET 请求,以获取 Jercy (MOXY) 生成的一些 JSON 值。
$(function(){
$("#getPerson").on("click", function(){
$.ajax({
url: "http://san.dev.local.com:4502/services/person/get",
type: "GET", crossDomain: true,
contentType: "application/json",
cache: false,
dataType: "json",
success: function (data) {
alert('success');
if($.trim(data) == "false") {
alert("Fail to recive");
}
else {
alert("Successfully data recived");
}
} ,error : function(err){
console.log(err);
alert("Error : "+err);
//YOUR CODE FOR AJAX FAILURE
}
});
});
});
[但是 ajax 请求的接受 header 显示 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8]" 这样可以吗?]
注意:我们的 service/Resource 被注释为
@Path("/get")
@GET
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON,MediaType.TEXT_XML})
public Person getPerson() {
.......................
.......................
}
但是每当我们发送 AJAX 请求来获取人员数据时,我们都会收到 CORS 错误
04:46:47.497 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the
remote resource at http://san.dev.local.com:4502/services/person/get?_=1442467869174.
(Reason: CORS request failed).1 <unknown>
注:
我们使用拦截代理来检查请求和响应 (OWASP ZAP)。
要求
OPTIONS http://san.dev.local.com:4502/services/person /get?_=1442467869171 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Origin: http://san.dev.local.com:8080
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
Host: san.dev.local.com:4502
回应
HTTP/1.1 200 OK
Connection: Keep-Alive
Server: Day-Servlet-Engine/4.1.52
Content-Type: text/html
Content-Length: 0
Date: Thu, 17 Sep 2015 05:32:24 GMT
Allow: GET,OPTIONS,HEAD
令人惊讶的是,响应 header
Access-control-Allow-Origin
响应中缺少。
非常感谢任何解决此问题的建议。
更新
对我来说,似乎是某个或其他过滤器覆盖了我们的设置。如果是这样,有没有办法处理这种情况。
刚才我们发现了这个 post : Java filter failing to set response headers。
通过添加服务排名修改了过滤器属性 属性 以保持过滤器在可能的堆栈中。
@Properties({ @Property(name = "filter.scope", label = "scope", value = "REQUEST"),
@Property(name = "filter.order", label = "order", value = "2"),
@Property(name = "service.ranking", intValue = 1)})
但这对我们也没有帮助。任何指点都会对我们有所帮助。
提前致谢, 桑
您已经知道收到 CORS 错误的原因是因为您的响应 header 中没有 Access-Control-Allow-Origin:* 值。在您的过滤器 servlet 中,您是否尝试过指定特定域(例如 http://san.dev.local.com:8080)?
您也可以尝试创建一个常规 servlet 并查看是否返回了 header。
应该链接过滤。也许添加一个自定义响应 header 值 (myvar: success) 以确保它从您的过滤器返回。您始终可以连接调试器以查看调用堆栈的样子,并可能找出正在使用的其他过滤器。