有没有更简单的方法可以在另一个HashMap中的HashMap中创建列表?

时间:2018-12-31 14:31:43

标签: java list arraylist hashmap keyvaluepair

我正在开发一个程序,该程序授权服务器的用户使用生成的密钥来访问它,而我目前正在开发生成部分。服务器的所有者可以指定多少个密钥,服务器ID和密钥的持续时间。我需要存储并检查密钥是否与serverID匹配,以便用户可以使用密钥来获取访问权限。

我唯一想到的是一个复杂的HashMap组合,其中包含另一个HashMap,并且在该HashMap中具有一个List。第一个字符串是每个服务器唯一的服务器ID,列表用于生成的密钥批次,最后的字符串值用于这些密钥的持续时间。

static HashMap<List<String>, String> keyTimeBundle = new HashMap<>();
static List<String> generatedKeys = new ArrayList<>();
static HashMap<String, HashMap<List<String>, String>> clientGeneratedKeys = new HashMap<>();

问题是,当密钥是否与匹配的服务器ID匹配时,我不知道从哪里开始,因为密钥在列表内的另一个HashMap中。我敢肯定还有另一种简单的方法可以实现这一点,但是我还没有想到,所以请不要使用我的方法来解释如何存储和检查值。

3 个答案:

答案 0 :(得分:3)

肯定变得笨拙。现在是时候通过一些经过深思熟虑的课程来减少过度增长的时间。在您的程序中给这些概念起个好名字,可以很容易地通过所需的逻辑和数据结构进行推理。

class Id {
    String value;
}

class Server {
    Id id;
    List<Key> keys;
}

class Key {
    Id id;
    Server server;
    Instant expirationDate;
}

每个密钥都有对其所用服务器的引用,每个服务器都有一个可以访问它的密钥列表。与其给密钥束分配失效时间,不如给每个密钥自己的失效时间。创建一批密钥只是意味着创建一堆密钥,并赋予它们相同的到期时间。

Id类可能只是String的简单包装,但是由于不必弄清楚哪些String有什么不同,它使代码更易于阅读。是(它们是ID?名称?)。名称Id清楚地表明它们是ID字符串。

有了类后,就可以更轻松地考虑所需的其他数据结构。例如,您需要某种全局映射来按ID查找服务器。

public static Map<Id, Server> serversById;

答案 1 :(得分:0)

我建议您实现一个键的POJO表示形式

public class Key{
    private String key;
    //duration is key specific this gives you more flexibility in issuing temporary individual keys
    private long duration;
    ....

然后将每个服务器密钥列表存储在地图中

HashMap<String, List<Key>> clientGeneratedKeys = ...

至于检查,请检查服务器的密钥列表中是否包含已提交的密钥(不要忘记根据比较“ key”属性来实现与之相等的Key类)

clientGeneratedKeys.get("Server Id").contains("submitted key");

您需要在上一行代码中进行一些空安全检查

答案 2 :(得分:0)

非常简单的不同方法只能使用res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Content-Type', 'text/javascript; charset=utf-8'); res.end(`(function(){ //Some JavaScript Code var foo="${bar}"; console.log("This a JavaScript file generated with Jade"); })()`); 。 您可以将密钥作为  HashMap<String,String>,其值作为该密钥在该特定服务器中的持续时间。

在搜索时,只需将serverId和键连接起来,并检查持续时间即可。