在执行CORS时,getJSON和ajax之间的cookie存在差异

时间:2013-07-17 16:09:36

标签: javascript jquery ajax json

我在Tomcat Java EE servlet容器中运行了基于REST的Web服务。

我正在编写一个来自另一个域的jquery客户端,因此正在使用CORS。它命中登录Web服务,然后是另一个呼叫。我最初使用getJSON实现了这两个调用,并且调用工作正常,但我没有让JSESSIONID cookie继续第二次调用,因此Web服务有一个未经验证的会话并抛出错误。

在做了研究之后,我遇到了使用问题进行ajax并认为这是我需要做的事情。预检中的AJAX登录调用失败。

所以,当我嗅到流量到我的网络服务器时,getJSON调用运行为两次获取并且看起来很好,除了cookie没有返回第二次调用。当我运行ajax调用时,它会对我的服务器执行OPTIONS调用,在客户端上获得200状态,然后因为我无法找到的原因而在jQuery内部失败。

var jqxhr = jQuery.getJSON(loginUrl, {
  xhrFields: {
      withCredentials: true
  },
  crossDomain: true
})
.done(function(response) {
    AgileJurySessionKey = response;
    AgileJuryLoggedIn = true;
    doneCallback();
})
.fail(function() {
    failCallback();
});

以下是同一个电话的AJAX版本:

jQuery.ajax(loginUrl, {
    type: "GET",
    contentType: "application/json; charset=utf-8",
    success: function(data, status, xhr) {
        alert(data);
        doneCallback;
    },
    error: function(jqxhr, textStatus, errorThrown) {
        alert(errorThrown);
        failCallback;
    },
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true
});

这两者有什么不同?

这是我为CORS添加到Web服务器的过滤器:

/**
 * This filter allows access to our web services from clients that are not on the local domain
 * 
 * @author Xerox
 */
public class CorsFilter extends OncePerRequestFilter {

  /* (non-Javadoc)
   * @see org.springframework.web.filter.OncePerRequestFilter#doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
   */
  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
          throws ServletException, IOException {
      response.addHeader("Access-Control-Allow-Origin", "*");
      if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
          // CORS "pre-flight" request
          response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
          response.addHeader("Access-Control-Allow-Headers", "X-Requested-With,Origin,Content-Type,Accept,Set-Cookie");
          response.addHeader("Access-Control-Max-Age", "1800");//30 min
      }
      filterChain.doFilter(request, response);
  }
}

3 个答案:

答案 0 :(得分:4)

jQuery.getJSON(loginUrl, {
  xhrFields: {
      withCredentials: true
  },
  crossDomain: true
})

$.getJSON的第二个参数是您要发送的数据,而不是选项对象。要使用这些,您需要直接致电$.ajax

答案 1 :(得分:1)

getJSON不是一个真正的方法,它只是一个便利功能,基本上是一个快捷方式:

$.ajax({
  dataType: "json",
});

基本上,$ .getJSON()的行为与$ .ajax()的行为相同,dataType设置为“json”

答案 2 :(得分:0)

由于CORS的持续问题,我终于放弃了这个问题,并且从另一端解决了这个问题。

我使用会话密钥回来跟踪会话的长度,然后根据这个重新附加安全性,这就是我设计安全性的方式。