1. 程式人生 > >JAVA 後端返回資料過濾不需要的欄位 萌新記錄

JAVA 後端返回資料過濾不需要的欄位 萌新記錄

之前做專案的時候,基本都是查到一個物件或者一個集合就拋給前端,也沒注意過敏感資料洩露的問題,最近經人提醒,開始考慮怎麼解決。

這裡貼一篇很不錯的博文

java介面資料json過濾欄位方法整理

但是專案用的是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裡面有的,它就會給你過濾掉,這是符合我專案需求的,於是就這麼用上了。

然後在這裡發一篇博文當作筆記,我是萌新,如果這個方法有什麼缺陷,或者有什麼更加好的辦法,麻煩路過的大神多多指教。