JAVA 後端返回資料過濾不需要的欄位 萌新記錄
阿新 • • 發佈:2018-12-27
之前做專案的時候,基本都是查到一個物件或者一個集合就拋給前端,也沒注意過敏感資料洩露的問題,最近經人提醒,開始考慮怎麼解決。
這裡貼一篇很不錯的博文
但是專案用的是fastjson,按照博文方法過濾的話有點麻煩,並且我的返回值是經過包裝的JSONObject,會帶上status、message等資訊,並且過濾欄位不確定,可能這個介面需要過濾它,另一個介面又必須使用它,所以博文裡的方法不適合我的專案。於是又瘋狂百度,終於找到了一個感覺還不錯的
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(TTown.class, "id","townname"); String result = JSONObject.toJSONString(townList,filter);
馬上Copy到專案中嘗試,結果發現這個過濾是把需要的欄位名填裡面,可一般都是需要的比較多,那有沒有辦法過濾不需要的呢?
當時繼續百度,但是沒找到什麼特別好的辦法,突然腦袋靈光一閃,對著SimplePropertyPreFilter按了Ctrl+滑鼠左鍵,發現它的構造方法是將傳入的引數add進includes(一眼看出是包含的意思)集合中的
於是把裡面的程式碼Copy出來,自定義一個類,將includes換成excludes,測試,成功~~
這樣,只要我返回的時候帶上過濾欄位的類 以及 需過濾的欄位名就行了。
貼上程式碼
package com.alibaba.fastjson.serializer; import java.util.HashSet; import java.util.Set; /* * Copyright 1999-2101 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class SimplePropertyPreFilter implements PropertyPreFilter { private final Class<?> clazz; private final Set<String> includes = new HashSet<String>(); private final Set<String> excludes = new HashSet<String>(); public SimplePropertyPreFilter(String... properties){ this(null, properties); } public SimplePropertyPreFilter(Class<?> clazz, String... properties){ super(); this.clazz = clazz; for (String item : properties) { if (item != null) { this.includes.add(item); } } } public Class<?> getClazz() { return clazz; } public Set<String> getIncludes() { return includes; } public Set<String> getExcludes() { return excludes; } public boolean apply(JSONSerializer serializer, Object source, String name) { if (source == null) { return true; } if (clazz != null && !clazz.isInstance(source)) { return true; } if (this.excludes.contains(name)) { return false; } if (includes.size() == 0 || includes.contains(name)) { return true; } return false; } }
可用到後來,發現這樣還是無法滿足專案需求,當我返回一個map,map裡面有幾個不同的物件時,就無法轉換了。當時想盡各種方法在原來的程式碼基礎上做修改,發現越改越複雜,而且很難實現。偶然之間,我看到了這個
就想試試如果不傳指定類是種什麼樣的結果
測試後發現,如果不傳指定類的話,只要你寫的欄位名是json裡面有的,它就會給你過濾掉,這是符合我專案需求的,於是就這麼用上了。
然後在這裡發一篇博文當作筆記,我是萌新,如果這個方法有什麼缺陷,或者有什麼更加好的辦法,麻煩路過的大神多多指教。