參數轉發: 對@ResponseBody 響應數據的攔截加密(或其他處理)

一.使用場景-參數轉發

1.springMVC 中使用註解@ResponseBody 響應接口返回數據;

2.大批量接口需要對請求參數做同個或相似處理,,比如對接收參數做解密之類;

二.實現

實現 ResponseBodyAdvice<T> 接口,重寫beforeBodyWrite函數;

三.demo

加密

@Component
@ControllerAdvice(basePackages = "xxx.controller")
public class EncryptResponseBody<T> implements ResponseBodyAdvice<T> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return returnType.getMethodAnnotation(ResponseBody.class) != null;
    }

    @SuppressWarnings("unchecked")
    @Override
    public T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {
        // 提取響應數據
        Map<String, Object> respdata = (Map) body;
        // Object 實際接口中響應返回的對象類型
        Object resp = (Object) respdata.get("Object");
        if (resp.getData() != null) {
            byte[] reqdata = null;
            ObjectMapper mapper = new ObjectMapper();
            try {
                String jsonData = mapper.writeValueAsString(resp.getData());
                reqdata = jsonData.getBytes("utf-8");
            }
            catch (JsonProcessingException | UnsupportedEncodingException e) {
                throw new IllegalStateException("json轉換失敗");
            }
            // TODO 處理數據 例:resp.setXXXX();
        }
        return (T) respdata;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章