renderJson用ie浏览器打开出现下载

超凡程序猿 发布于 2015/05/26 19:10
阅读 1K+
收藏 0

@JFinal 你好,想跟你请教个问题:renderJson用ie浏览器打开出现下载,请问该怎么解决呢

加载中
2
maosi
maosi
/**
 * http://zh.wikipedia.org/zh/MIME
 * 在wiki中查到: 尚未被接受为正式数据类型的subtype,可以使用x-开始的独立名称(例如application/x-gzip)
 * 所以以下可能要改成 application/x-json
 * 
 * 通过使用firefox测试,struts2-json-plugin返回的是 application/json, 所以暂不改为 application/x-json
 * 1: 官方的 MIME type为application/json, 见 http://en.wikipedia.org/wiki/MIME_type
 * 2: IE 不支持 application/json, 在 ajax 上传文件完成后返回 json时 IE 提示下载文件
 */
private static final String contentType = "application/json; charset=" + getEncoding();
private static final String contentTypeForIE = "text/html; charset=" + getEncoding();

上面的代码是jfinal中JsonRender.java的源码,大致意思是针对JSON的标准MIME type为

application/json
但IE不支持这种类型.

你可以理解为没有forIe()方法的是针对JSON的标准的方法,而带有forIe()方法的是为了兼容IE只能使用最常见的MIME TYPE.前者可以通过其contentType知道具体的类型,后者则无法得知确切的类型了

0
maosi
maosi
官方手册里有
IE 不支持 contentType 为 application/json,在 ajax 上传文件完成后返回 json 时 IE 提示下载文 件,解决办法是使用:render(new JsonRender(params).forIE())。
超凡程序猿
超凡程序猿
我试过了,但是为什么不全部用这种方式写呢,renderjson和这个在其他浏览器的效果不是一样的吗
0
tkl2wf
tkl2wf
前两天遇到这样的问题,网上找的,说把contentType改为application/html
超凡程序猿
超凡程序猿
非常感谢你的回复
0
Holt_Vong
Holt_Vong
为什么要用IE打开看JSON数据呢,仅仅为了测试?
超凡程序猿
超凡程序猿
js如果有错误,ie访问网站的时候不就会出现json下载了么
0
idreamblue
idreamblue
@Override  
	public void renderJson(Object object) {
		if (isIE()) {
			render(new JsonRender(object).forIE());
		}else {
			super.renderJson(object);
		}
	}
	
	@Override
	public void renderJson(String jsonText) {
		if (isIE()) {
			render(new JsonRender(jsonText).forIE());
		}else {
			super.renderJson(jsonText);
		}
	}
	
	@Override
	public void renderJson(String[] attrs) {
		if (isIE()) {
			render(new JsonRender(attrs).forIE());
		}else {
			super.renderJson(attrs);
		}
	}
	
	@Override
	public void renderJson() {
		if (isIE()) {
			render(new JsonRender().forIE());
		}else {
			super.renderJson();
		}
	}
	
	@Override
	public void renderJson(String key, Object value) {
		if (isIE()) {
			render(new JsonRender(key, value).forIE());
		}else {
			super.renderJson(key, value);
		}
	}
	
	/**
	 * 判断是否万恶的IE
	 * @return
	 */
	public boolean isIE(){
		HttpServletRequest request = this.getRequest();
		String user_agent = request.getHeader("USER-AGENT");
		if (null == user_agent || "".equals(user_agent)) {
			return false;
		}
		String request_method = request.getMethod().toUpperCase();
		return (user_agent.toUpperCase().indexOf("MSIE")>0?true:false) && "POST".equals(request_method);
	}

我是在基类BaseAction 里覆盖了 renderJson()方法



idreamblue
idreamblue
回复 @超凡程序猿 : 这是为了解决jfinal在easyui下下载json的问题,这只是个思路,希望可以帮到你。
超凡程序猿
超凡程序猿
有一点不明白,为什么判断是否为IE怎么还要判断get或者post提交方式啊
超凡程序猿
超凡程序猿
不过很感谢你的回复
超凡程序猿
超凡程序猿
我之前也试过了,但是所有的controller都继承这个baseAction的话貌似通过注解controller的方式添加路由好像就有问题了呢
返回顶部
顶部