我在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);
}
}
答案 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的持续问题,我终于放弃了这个问题,并且从另一端解决了这个问题。
我使用会话密钥回来跟踪会话的长度,然后根据这个重新附加安全性,这就是我设计安全性的方式。