概述
在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效果: