【问题标题】:Mask value of selected key in JSONJSON中所选键的掩码值
【发布时间】:2015-07-06 09:01:07
【问题描述】:

我有 JSON 请求和响应,我想在日志中打印 JSON,但是我想避免在日志中打印一些安全字段,我正在尝试屏蔽字段键: 示例:

屏蔽前:

  {"username":"user1","password":"123456","country":"US","creditCardNumber":"1283-1238-0458-3458"}

屏蔽后

{"username":"user1","password":"XXXXXX","country":"US","creditCardNumber":"XXXXXX"}

我正在使用 java Gson lib,请帮我这样做

编辑

我想动态传递密钥,所以在函数a 中我想屏蔽这些字段,但在函数b 中不同的字段。

【问题讨论】:

标签: java json gson


【解决方案1】:

我认为您应该从日志中排除这些字段。下面是一个使用Gson@Expose 注解的简单示例。

public static void main(String[] args) throws IOException {
    String json = "{\"username\":\"user1\",\"password\":\"123456\",\"country\":\"US\",\"creditCardNumber\":\"1283-1238-0458-3458\"}";

    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);

    System.out.println(gson.toJson(user));

    Gson gsonExpose = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    System.out.println(gsonExpose.toJson(user));
}

public class User {
    @Expose
    private String username;
    private String password;
    @Expose
    private String country;
    private String creditCardNumber;
}

输出将是:

{"username":"user1","password":"123456","country":"US","creditCardNumber":"1283-1238-0458-3458"}
{"username":"user1","country":"US"}

另一种使用反射的解决方案:

public static void main(String[] args) throws IOException {
    String json = "{\"username\":\"user1\",\"password\":\"123456\",\"country\":\"US\",\"creditCardNumber\":\"1283-1238-0458-3458\"}";

    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);

    List<String> fieldNames = Arrays.asList("password", "creditCardNumber");
    System.out.println(mask(user, fieldNames, "XXXXXXX"));
}

public static String mask(Object object, List<String> fieldNames, String mask) {
    Field[] fields = object.getClass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        if (fieldNames.contains(fields[i].getName())) {
            try {
                fields[i].setAccessible(true);
                if (fields[i].get(object) != null) {
                    fields[i].set(object, mask);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    Gson gson = new Gson();

    return gson.toJson(object);
}

【讨论】:

  • 这段代码是否会从序列化和反序列化中排除字段?
  • 当你想排除字段时,你可以使用 GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()。当您序列化所有没有@Expose 的字段时,将被排除在外,与反序列化相同。如果使用new Gson(),一切正常。
  • 屏蔽总是会发生,我可以通过我想要隐藏/屏蔽的键,而不是使用注释吗?
  • 不,如果您想准确传递要排除或屏蔽的键,您应该使用反射来做到这一点,我使用反射更新了另一个解决方案的答案。
  • @jdev 我更新了答案,带参数的函数掩码是您要掩码的对象,列出您要掩码的字段名称,以及您要成为掩码的字符串,检查并告诉我是否任何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多