Shi*_*iva 21 java ajax jquery waffle internet-explorer-11
我正在开发基于Spring MVC的webapp.
下面是我的环境信息: - ,
Java 1.8.0_162 (64 bit),,Spring 4.3.1 为SSO,和.Apache Tomcat 8.0.49Waffle-1.8.3jquery-1.11.3Google Charts API
将以下JavaScript代码放在一个常见的JS文件中: -
$.ajaxSetup({ cache: false });
POST对服务器的jQuery AJAX 请求在Mozilla和Chrome浏览器中完美运行.但是当谈到IE 11浏览器时,jQuery AJAX POST请求只有在第一次加载窗口时才能正常工作.然后随机失败并且一旦失败,后续请求也会失败.
以下是IE 11浏览器的" 网络"选项卡的快照: -
这两个请求在其各自的请求主体中都有JSON对象.但是,成功请求的Content-Length属性值为416(字符串化JSON对象的总字符数),失败的属性值为0.对于随机失败的POST请求和后续请求,Content-Length始终为0,但计算的JSON对象始终存在于请求正文中.在每个请求中,JSON对象都是动态构建的.
UPDATE-1(26March2018)以下是文件中Waffle定义的AD身份验证配置web.xml: -
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>
<init-param>
<param-name>principalFormat</param-name>
<param-value>fqn</param-value>
</init-param>
<init-param>
<param-name>roleFormat</param-name>
<param-value>both</param-value>
</init-param>
<init-param>
<param-name>allowGuestLogin</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>securityFilterProviders</param-name>
<param-value>
waffle.servlet.spi.NegotiateSecurityFilterProvider
</param-value>
</init-param>
<init-param>
<param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
<param-value>
Negotiate
NTLM
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/welcome.do</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
只有1个 URL,即/welcome.do(加载webapp的初始URL)配置为调用SSO身份验证.
以下是触发AJAX请求的JavaScript代码: -
function getData() {
let dashboardFilterParams=new DashboardFilterParams(<passing the arguments to this constructor>);
//alert(JSON.stringify(dashboardFilterParams));
//console.dir(dashboardFilterParams);
$.ajax({
url: str_THIS_WA_URL+"/xyz/abcdXYZ.do?httpReqType=ajaxReq",
data: JSON.stringify(dashboardFilterParams),
dataType: "json",
contentType: "application/json",
mimeType: "application/json",
type: "POST",
success:function(responseData){
if(responseData && "success"===responseData.reqResult) {
//populating tables & drawing charts using Google Charts JS API if successfully fetched the data
} else {
//showing error message
}
},
error:function(data,status,er) {
showTheMessage("danger","Error getting data");
console.log("error: "+JSON.stringify(data)+"\n status: "+status+"\n er:"+er);
}
});
}
Run Code Online (Sandbox Code Playgroud)
IE 11版本细节:
此外,我正在使用Google Charts API在页面上呈现图表.向Google Charts API服务器发出请求.这在IE浏览器中有效吗?
使其在IE 11浏览器中运行的解决方案是什么?
在评论部分回答Federico klez Culloca的问题:
请求(客户端)端没有错误.但服务器的回应说The request sent by the client was syntactically incorrect.和响应标头Response HTTP/1.1 400 Bad Request.
请求正文内容绝对没有区别.
str_THIS_WA_URL variable与webapp相同的域的指向,即AJAX请求在当前域内.
在URL中添加时间戳(在shawn在下面的评论部分中的建议)并没有解决问题.
IE 这样做是一种优化,因为它期望服务器回复 HTTP/401 凭据质询,并且传输正文两次将是一种浪费。
在您的情况下,由于/welcome.do使用 NTLM 进行保护,IE 现在假设/ 以下所有内容都是安全保护空间的一部分,因此将无主体 POST 优化应用于所有内容。
解决方法是转移/welcome.do到/secured/welcome.do并确保不存在不安全的资源/secured。
更多详细信息请参见:质询-响应身份验证和零长度帖子。