从http协议研究json返回在IE中下载

来源:互联网 发布:淘宝车内饰品 编辑:程序博客网 时间:2024/06/05 05:57

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请求。


以上是愚见,还望各位大侠指正

原创粉丝点击