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

CORS issue with rest service hosted in Adobe CQ

我们在 Adob​​e 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) 以确保它从您的过滤器返回。您始终可以连接调试器以查看调用堆栈的样子,并可能找出正在使用的其他过滤器。