servlet返回application/json數據類型在ie瀏覽器中提示下載文件問題

概述

    在servlet中設置response.setContentType(“application/json”)返回json格式數據類型時在ie瀏覽器中提示下載文件。這種現象是ie瀏覽不支持application/json數據格式引起的,只要在servlet中再填上一句response.setHeader("Content-Type", "text/html")就能解決問題(應爲瀏覽器對數據格式的識別靠的是響應頭裏面的Content-Type,所以,此種情況下頁面在處理返回數據的時候,要先利用js把文本格式轉化爲json格式:eval()函數可以實現此功能)。

(注意:有文章說,ie瀏覽器重ie10開始就開始支持application/json了,但是我親測過後並不是這個樣子,不說ie10,就連ie11也不支持,也有可能是我的瀏覽器問題)



    乍一看response.setContentType(XX)和response.setHeader("Content-Type", XX)不是一樣的概念嗎,其實並不是這樣子的,前者設置返回的數據的類型,和瀏覽器沒多大關係(其實也有關係,在設置前者而不設置後者的情況下,後者的值默認爲前者,但是兩者確實是有本質的區別的),後者設置的是相應頭參數,響應頭中的Content-Type決定了瀏覽器以什麼方式來處理相應內容。

response.setContentType(“application/json”):表示響應數據類型是json


response.setHeader("Content-Type",“application/json”):表示響應頭參數值


代碼檢驗

服務器端只設置response.setContentType,出現瀏覽器接收到服務器端返回的數據類型和響應頭Content-Type值都爲response.setContentType設置的值:


代碼:

package com.sends.test;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		response.setContentType("application/json");
		response.setCharacterEncoding("utf-8");
		//response.setHeader("Content-Type", "text/html");
		
		PrintWriter writer = response.getWriter();
		writer.write("{\"msg\":\"success\"}");
		writer.flush();
		writer.close();
		
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}


瀏覽器效果:

    


服務器端同時設置response.setContentType("XXX")和response.setHeader("Content-Type","XXX"),瀏覽器顯示返回數據類型爲response.setContentType("XXX")設置值,響應頭值爲response.setHeader("Content-Type","XXX")設置值:


代碼:

package com.sends.test;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		response.setContentType("application/json");
		response.setCharacterEncoding("utf-8");
		response.setHeader("Content-Type", "text/html");
		
		PrintWriter writer = response.getWriter();
		writer.write("{\"msg\":\"success\"}");
		writer.flush();
		writer.close();
		
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

瀏覽器效果:

               


ie瀏覽器就要設置爲此種情況程序才能正常工作:

爲了進一步驗證,來一個絕一點的例子,響應內容類型爲text/html,響應頭Content-Type參數值設置爲application/json。結果顯示,雖然響應內容爲text/html格式,ie瀏覽器仍舊提示下載文件。

代碼:

package com.sends.test;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public TestServlet() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		response.setHeader("Content-Type", "application/json");
		
		PrintWriter writer = response.getWriter();
		writer.write("{\"msg\":\"success\"}");
		writer.flush();
		writer.close();
		
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

ie效果:

    



更正:

通過同時反映,瞭解到以上描述是錯誤的,setHeader("Content-Type", "XXX")和setContentType("XXX")描述的是一樣的概念(https://github.com/apache/tomcat80/blob/trunk/java/org/apache/coyote/Response.java#L32),如果要ie瀏覽器裏面返回的數據不提示下載,只需要setContentType("text/html")就行了,然後在處理返回信息的時候先利用js把數據轉化爲想要的對象再進行處理。


發佈了48 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章