我们在Adobe CQ中托管的休息服务存在CORS问题(请注意,这仅是概念验证应用程序)。为了解决这个问题,我们添加了一个简单的过滤器来设置所需的响应头。 过滤器的代码有点像
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请求的接受标题显示“Accept:text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8]”这是OK?]
注意:我们的服务/资源用
注释@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
令人惊讶的是,响应头
Access-control-Allow-Origin
在回复中缺失。
非常感谢任何解决此问题的指示。
对我来说,似乎某些或其他过滤器会覆盖我们的设置。如果是这样,有没有办法处理这种情况。
刚才我们发现了这篇文章:Java filter failing to set response headers。
通过添加服务排名属性来修改filder属性,以使过滤器保持在possibel堆栈中。
@Properties({ @Property(name = "filter.scope", label = "scope", value = "REQUEST"),
@Property(name = "filter.order", label = "order", value = "2"),
@Property(name = "service.ranking", intValue = 1)})
但这对我们也没有帮助。任何指针对我们都有帮助。
提前致谢, 圣
答案 0 :(得分:1)
您已经知道获得CORS错误的原因是因为响应头中没有Access-Control-Allow-Origin:*值。在您过滤servlet中您是否尝试过指定特定域(例如http://san.dev.local.com:8080)?
您还可以尝试创建常规servlet并查看是否返回了标头。
过滤应该是链接的。也许添加自定义响应标头值(myvar:success)以确保从过滤器返回它。您总是可以连接调试器以查看调用堆栈的外观,并可能找出正在使用的其他过滤器。