大部分人的第一反應是通過 Spring 攔截器(Interceptor)中的postHandler
方法處理。實際這是行不通的,因爲當程序運行到該方法,是在返回數據之後,渲染頁面之前,所以這時候 Response 中的輸出流已經關閉了,自然無法在對返回數據進行處理。
其實這個問題用幾行代碼就可以搞定,因爲 Spring 提供了非常豐富的擴展支持,無論是之前提到的Interceptor
和MethodArgumentResolver
,還是接下來要提到的HttpMessageConverter
。
在 Spring MVC 的 Controller 層經常會用到@RequestBody
和@ResponseBody
,通過這兩個註解,可以在 Controller 中直接使用 Java 對象作爲請求參數和返回內容,而完成這之間轉換作用的便是HttpMessageConverter
。
HttpMessageConverter
接口提供了 5 個方法:
canRead
:判斷該轉換器是否能將請求內容轉換成 Java 對象canWrite
:判斷該轉換器是否可以將 Java 對象轉換成返回內容getSupportedMediaTypes
:獲得該轉換器支持的 MediaType 類型read
:讀取請求內容並轉換成 Java 對象-
write
:將 Java 對象轉換後寫入返回內容其中
read
和write
方法的參數分別有有HttpInputMessage
和HttpOutputMessage
對象,這兩個對象分別代表着一次 Http 通訊中的請求和響應部分,可以通過getBody
方法獲得對應的輸入流和輸出流。
具體步驟:這裏使用的springBoot的方法進行配置
首先繼承MappingJackson2HttpMessageConverter並重寫 writeInternal 方法
package com.wjyb.server.wx.expand.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.Type;
/**
* @author lyc
* @Description:
* @create 2019-01-02
*/
@Component
public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 使用 Jackson 的 ObjectMapper 將 Java 對象轉換成 Json String
ObjectMapper mapper = new ObjectMapper ();
String json = mapper.writeValueAsString (object);
logger.info ("原來的json"+json);
// 加密
String result = json + "加密了!";
logger.info ("加密後的json"+result);
// 輸出
outputMessage.getBody ().write (result.getBytes ());
}
}
然後實現WebMvcConfigurer,需要將這個自定義的轉換器配置到 Spring 中,這裏通過重寫WebMvcConfigurer
中的configureMessageConverters
方法添加自定義轉換器
package com.wjyb.server.wx.expand.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
/**
* @author lyc
* @Description:
* @create 2018-12-28
*/
@Configuration
public class Test implements WebMvcConfigurer {
@Resource
private MyMappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add (mappingJackson2HttpMessageConverter);
}
}
完成這只是個大概的實現步驟,其他細節就靠你自己了