1. 问题描述:在项目中,遇到这么一个问题。后台struts2使用json返回,前台使用ajaxForm请求后台,响应成功后,在IE浏览器下出现下载现象。而在火狐下没有问题,测试正常。而ie中发送的ajax请求,返回json相应的话,则不会出现下载。
2.问题分析:
2.1 由浏览器不同响应状况不同的表现看出,问题应该出在前端浏览器的处理。而在ie中,采用ajax请求不出现下载提示,则说明肯定是发送的http请求有问题。
请求头如下:
2.1.1采用ajaxForm请求方式:
=== MimeHeaders ===
accept = image/gif,image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,application/vnd.ms-xpsdocument, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, application/x-ms-application,application/x-ms-xbap, application/xaml+xml, */*
referer =**************(项目原因,故此注释,此字段表示请求来自的页面URL)
accept-language = zh-cn
user-agent = Mozilla/4.0 (compatible; MSIE 8.0;Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NETCLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E; .NET4.0C)
content-type = multipart/form-data;boundary=---------------------------7dcfa1d150954
accept-encoding = gzip, deflate
host = localhost:8080
content-length = 2871
connection = Keep-Alive
cache-control = no-cache
cookie = JSESSIONID=8E1A6C336C59C64C245552188A0F93A0
2.1.2 采用ajax请求方式
=== MimeHeaders ===
x-requested-with =XMLHttpRequest
accept-language = zh-cn
referer = ********(项目原因,故此注释,此字段表示请求来自的页面URL)
accept = application/json, text/javascript,*/*; q=0.01
accept-encoding = gzip, deflate
user-agent = Mozilla/4.0 (compatible; MSIE 8.0;Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NETCLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E; .NET4.0C)
host = localhost:8080
content-length = 0
connection = Keep-Alive
cache-control = no-cache
cookie = JSESSIONID=8CEFFB5FFF4F49931CCAA7C5136E1334x
比较两种请求头,可以看出红字标出的部分,有区别。x-requested-with表示采用的是ajax请求方式,与form请求区分开。而accept表示接受的格式。可以看出ajaxForm请求,是一个标准的form请求,并不是一个ajax请求。
问题调试:
1采用ajax请求设置请求头的方式设置
看到上面的差异,我在调查时,第一印象是想将ajaxForm请求头的accept设置成application/json格式。在beforeSend(XMLHTTPRESQUEST)注册头中使用setRequestHeader ("Accept","image/gif,image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,application/vnd.ms-xpsdocument, application/vnd.ms-excel,application/vnd.ms-powerpoint, application/msword, application/x-ms-application,application/x-ms-xbap, application/xaml+xml, */*");
而服务器端接受到的请求头仍没有变化,没有起效果。说明ajaxFrom在发送请求时,实际上调用的是form的submit请求生成了form请求。
也就是说,form关键点在form请求和ajax请求的区别上面。
而form请求由各自的浏览器内部实现生成。个人无法设置其http请求头。
因此解决方案将在服务器返回的相应头中进行处理。
相应头中设置mime类型为text/html,也就是在struts2配置文件中加入
<action name="*JsonAction"class="{1}JsonAction">
<resultname="json" type="json">
<paramname="contentType">text/html</param>
</result>
</action>
,ie浏览器将按照html进行解析,不会才去下载方式。而在成功的success方法里使用jQuery.parseJSON
(string json)来生成json对象。从而在js中使用json对象,实现ajax请求调用。
备注:后续调查,而采用ajaxForm方式请求时,如果form不包含文件类型,请求发送时,实际上也是一个ajax请求。发送的请求头如同ajax调用方式一样。
3问题结论:
从此问题学习到以下几点:
一、form请求由浏览器内部实现方式,浏览器不同,请求发送的请求头不同。
二、ajax请求在各个浏览器的请求响应处理相同。
三、ajaxForm 在form包含数据中没有流数据(文件类型)数据时,采用ajax请求,反之采用form请求。
以上是愚见,还望各位大侠指正