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里面有的,它就会给你过滤掉,这是符合我项目需求的,于是就这么用上了。

然后在这里发一篇博文当作笔记,我是萌新,如果这个方法有什么缺陷,或者有什么更加好的办法,麻烦路过的大神多多指教。

Java后端开发中,跨域问题通常是指在Web应用程序中,前端页面与后端服务器进行交互时,由于浏览器的同源策略限制,导致不同源之间的请求被阻止的问题。同源策略要求协议、域名和端口都相同才能进行交互。为了解决这个问题,可以采用以下几种方法: 1. JSONP(JSON with Padding): JSONP是一种古老的跨域技术,它利用`<script>`标签不受同源策略限制的特性来实现跨域请求。服务器端需要提供一个回调函数来包裹JSON数据,前端则通过动态创建`<script>`标签的方式发起请求。但JSONP只支持GET请求,且存在安全隐患。 2. CORS(跨源资源共享): CORS是一种现代的、标准的跨域解决方案。后端需要在响应头中添加`Access-Control-Allow-Origin`字段,指定哪些域名可以访问资源。如果需要接受特定的HTTP请求头或者POST请求,还需要设置`Access-Control-Allow-Headers`和`Access-Control-Allow-Methods`。CORS支持所有类型的HTTP请求。 3. 使用代理服务器: 在前端和后端之间设置一个代理服务器,前端将请求发送到代理服务器,代理服务器转发请求到后端服务器。后端服务器将响应返回给代理服务器,然后由代理服务器转发给前端。这种方式对前端透明,只在服务器端做改动。 4. 使用过滤器(Filter): 在Java后端可以使用过滤器来统一处理跨域问题。例如在Spring框架中,可以创建一个全局的CORS配置类,重写`addCorsMappings`方法,在方法中配置允许跨域的路径和相关设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值