我正在开发基于Spring MVC的webapp。
以下是我的环境详情: -
针对SSO的Java 1.8.0_162 (64 bit)
,Spring 4.3.1
,Apache Tomcat 8.0.49
,Waffle-1.8.3
,jquery-1.11.3
和Google Charts API
。
将以下JavaScript代码放在一个常见的JS文件中: -
$.ajaxSetup({ cache: false });
对服务器的jQuery AJAX POST
请求在 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
文件中定义的web.xml
AD身份验证配置: -
<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>
只有 1 网址,即/welcome.do
(加载网络应用的初始网址)配置为调用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);
}
});
}
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 的建议在下面的评论部分中)并没有解决问题。
答案 0 :(得分:1)
IE之所以将其作为一种优化,是因为它希望服务器以HTTP / 401凭据质询进行响应,并且两次传输正文都是浪费。
在您的情况下,由于/welcome.do
受NTLM保护,因此IE现在假定/
及其以下所有内容是受保护的保护空间的一部分,因此应用了无主体的POST优化一切。
一种解决方法是将/welcome.do
移至/secured/welcome.do
并确保/secured
下没有不安全的资源。
此处有更多详细信息:Challenge-Response Authentication and Zero-Length Posts。