2015-04-07 76 views
0

我正在使用最新的Spring 4.1.5创建一个RESTful后端。经过测试的网络服务部门正在完善工作。我为他们实现了SimpleCorsFilter,以使这些工作跨域。SmartGWT Datasource和CORS

public class SimpleCORSFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletResponse response = (HttpServletResponse) res; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
     chain.doFilter(req, res); 
    } 
    public void init(FilterConfig filterConfig) {} 
    public void destroy() {} 
} 

在使用SmartGWT RESTDataSource测试这些Web服务之前,我首先使用一些JavaScript进行测试。我有三种测试方法。 第一种方法基于StackOverflow中的另一个链接,这表明这将是一个很好的测试,以确保SmartGWT数据源可以正常工作。 当我从浏览器测试这段代码时,我得到一个交叉脚本错误。

但是,接下来的两种方法很适合带回数据。因此,在这种情况下,我相信网络服务将跨域运作。

$("#retrieve2").click(function() 
{ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET','http://127.0.0.1:8080/urm-ws-0.0.1-SNAPSHOT/rest/login/user/tholmes/pwd/mypwd'); 
    xhr.onreadystatechange = function() 
    { 
     if (this.status == 200 && this.readyState == 4) 
     { 
      console.log('response: ' + this.responseText); 
     } 
    }; 
    xhr.send(); 
}); 

$("#retrieve3").click(function() 
{ 
    $.ajax(
      { 
       url : "http://localhost:8080/urm-ws-0.0.1-SNAPSHOT/rest/login/user/tholmes/pwd/mypwd" 
      }) 
    .then(
      function(data) { 
       $('#userId').append(data.userId); 
       $('#username').append(data.username); 
      }); 

}); 

对JavaScript不太了解,我想知道三种方法的区别是什么?第一种方法由于某种原因不起作用,所以我不知道是否需要修复该代码,还是需要修复该JavaScript方法中的代码?

最终,我想让我的web服务与SmartGWT数据源一起工作。我知道这可以做到,我觉得我就在那里。 如果我需要提供更多信息,请告诉我。谢谢你的帮助。

+0

您对第一种情况有什么错误? – udalmik

+1

这是Firefox浏览器说有一个被阻止的跨源脚本调用。但是,我刚刚解决了这个问题,所以我认为我现在已经设定好了。我有一个GET工作,所以现在我必须尝试,PUT,POST和DELETE。 – tjholmes66

回答

0

,我发现我的答案与部分:

的CORS筛选他们比我的略有不同。 我有以下几点:

response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 

,它真正需要的是:

response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type, If-Modified-Since"); 

一旦我加了这一点,那么第一个JavaScript方法有效,而一旦奏效,那么我能测试我的SmartGWT数据源,它与我的远程RESTful Web服务一起工作。

0

在第一种情况下的浏览器发送预检OPTIONS请求,因为应用/ JSON内容类型。我想这个请求在服务器上没有正确处理。在这种差异更多信息,可以发现here