首先在sprigMvc的配置文件中配置返回結果集使用的類
<!-- 參數轉碼 --> <mvc:annotation-driven> <!-- 注冊處理 JSON 的轉換器 register-defaults="true" --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8" /> <property name="writeAcceptCharset" value="false" /> </bean> <bean class="com.util.json.JsonConverter"> <property name="supportedMediaTypes"> <list> <!-- 這里順序不能反,一定先寫text/html,不然ie下出現下載提示 --> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
由於現有工程使用的是json對象結果集,所以只對json格式的參數進行轉義
然后在自己工程里配置一個JSON返回結果集的參數轉換類
package com.util.json; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.HttpMessageNotWritableException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; /** * JSON格式返回參數轉換類 * <功能詳細描述> * * @author songxiaotong * @version [版本號, 2016年10月14日] * @see [相關類/方法] * @since [產品/模塊版本] */ public class JsonConverter extends FastJsonHttpMessageConverter { /** * 日志記錄器 **/ private static final Logger LOGGER = LogManager.getLogger(JsonConverter.class); /** * 重寫writeInternal方法,在返回內容前首先進行HTML字符轉義 * <功能詳細描述> * @param object * @param outputMessage * @throws IOException * @throws HttpMessageNotWritableException * @see [類、類#方法、類#成員] */ @Override protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { // 獲取輸出流 OutputStream out = outputMessage.getBody(); // 獲取要輸出的文本 String text = JSON.toJSONString(object, super.getFeatures()); // 對文本做HTML特殊字符轉義 String result = convertJson(text); // 輸出轉義后的文本 out.write(result.getBytes(super.getCharset())); } /** * JSON參數轉義 * <功能詳細描述> * @param json * @return * @see [類、類#方法、類#成員] */ private String convertJson(String json) { try { // 判斷是否是JSON對象 if (json.startsWith("{")) { // 將參數轉換成JSONObject JSONObject jsonObj = JSONObject.fromObject(json); // 處理參數 JSONObject myobj = jsonObj(jsonObj); return myobj.toString(); } // 判斷是否是JSON數組 else if (json.startsWith("[")) { // 將參數轉換成JSONArray JSONArray jsonArray = JSONArray.fromObject(json); //處理參數 JSONArray array = parseArray(jsonArray); return array.toString(); } else { return json; } } catch (JSONException e) { LOGGER.error("Json數據解析處理失敗!"); return "{}"; } } /** * JSON參數Map(對象)轉義 * <功能詳細描述> * @param json * @return * @see [類、類#方法、類#成員] */ @SuppressWarnings("rawtypes") private JSONObject jsonObj(JSONObject json) { for (Iterator iter = json.keys(); iter.hasNext();) { // 獲取對象的key String key = (String)iter.next(); // 獲取對象的值 Object obj = json.get(key); // 判斷對象類型 if (obj instanceof List) { json.put(key, parseArray((JSONArray)obj)); } // 判斷是否是對象結構 else if (obj instanceof Map) { // 處理參數 json.put(key, jsonObj((JSONObject)obj)); } else if (obj instanceof String) { // 處理參數 json.put(key, convertStr((String)obj)); } } return json; } /** * JSON參數List(數組)轉義 * <功能詳細描述> * @param json * @return * @see [類、類#方法、類#成員] */ private JSONArray parseArray(JSONArray jsonArray) { // 判空 if (null == jsonArray || jsonArray.isEmpty() || jsonArray.size() == 0) { return jsonArray; } // for (int i = 0, l = jsonArray.size(); i < l; i++) { Object obj = jsonArray.get(i); // 判斷是否是數據結構 if (obj instanceof List) { // 處理數組對象 parseArray((JSONArray)obj); } // 判斷是否是對象結構 else if (obj instanceof Map) { // 處理參數 jsonObj((JSONObject)obj); } // 判斷是否是String結構 else if (obj instanceof String) { jsonArray.set(i, convertStr((String)obj)); } } return jsonArray; } /** * HTML腳本轉義 * <功能詳細描述> * @param str * @return * @see [類、類#方法、類#成員] */ private String convertStr(String str) { // TODO &、<、>、"、'、(、)、%、+、\ return str.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'") .replace("(", "(") .replace(")", ")") .replace("%", "%") .replace("+", "+") .replace("\\", "\"); } }