从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请求。
以上是愚见,还望各位大侠指正
- 从http协议研究json返回在IE中下载
- servlet返回application/json数据类型在ie浏览器中提示下载文件问题
- 解决EasyUI Form submit和SpringMVC返回JSON在IE中变下载的问题
- 解决SpringMVC返回JSON在IE中变下载的问题
- 解决SpringMVC返回JSON在IE中变下载的问题
- 解决在IE浏览器中返回json格式的数据时提示下载办法
- 返回JSON数据,在IE下提示下载文件
- 避免IE在ajax请求时,返回json出现下载
- IE中返回application/json弹出下载框问题
- ajaxsubmit提交表单返回json在ie浏览器下会出现下载json情况
- ajaxsubmit提交表单返回json在ie浏览器下会出现下载json情况
- 返回Json对象时,IE提示下载
- IE下返回Json提示下载
- 服务器返回JSON,IE出现下载问题
- form+iframe上传文件返回json在IE下提示下载的问题(源于ueditor的错误)(从ITEYE搬家过来的)
- .NET easyui form提交后,返回json数据在IE下弹出下载的问题解决方法
- 解决struts2 返回json是,在ie,360等浏览器中弹出下载框的问题。
- 返回Json格式在IE下会提示打开或下载
- AutoResetEvent.WaitAll 等到人生三大事,然后大笑开心。
- html5按字母顺序排列的标签列表
- c sockopt选项
- C++学习笔记(一)--基础知识sizeof用法 .
- Java 开发:PreparedStatement的用法
- 从http协议研究json返回在IE中下载
- paip.银行卡号的发卡行归属地查询
- 汇编语言代码书写规范
- Makefile教程(一)(转)
- Linux网络协议栈(一)——Socket入门(1)
- c结构体字节对齐
- java命令
- 干货--如何利用微博来写原创文章
- unity 2.0 interception 学习1