在Adobe CQ中托管的休息服务的CORS问题

时间:2015-09-17 06:18:02

标签: jquery filter cors cq5 sling

我们在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)})

但这对我们也没有帮助。任何指针对我们都有帮助。

提前致谢, 圣

1 个答案:

答案 0 :(得分:1)

您已经知道获得CORS错误的原因是因为响应头中没有Access-Control-Allow-Origin:*值。在您过滤servlet中您是否尝试过指定特定域(例如http://san.dev.local.com:8080)?

您还可以尝试创建常规servlet并查看是否返回了标头。

过滤应该是链接的。也许添加自定义响应标头值(myvar:success)以确保从过滤器返回它。您总是可以连接调试器以查看调用堆栈的外观,并可能找出正在使用的其他过滤器。