Happywzy~ 2021-08-16 10:27 采纳率: 100%
浏览 108
已结题

URL高效匹配算法如何实现?

项目想通过URL来实现接口鉴权,用户下可以查询到能访问的URL列表,但是URL可能是一个正则表达式,如下所示,某个用户的URL列表,表示用户可以访问
/aa/bb,/aa/cc,和/bb下所有的接口。

/aa/bb
/aa/cc
/bb/**
  • 写回答

2条回答 默认 最新

  • Happywzy~ 2022-02-08 14:40
    关注
    
    
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @ClassName: TestPath
     * @Description: TODO
     * @Author: wuzhiyong
     * @Time: 2022/2/8 10:57
     * @Version: v1.0
     **/
    public class TestPath {
        public static void main(String[] args) {
            List<String> paths = new ArrayList<>();
            paths.add("/a/a/vv/vv/d");
            paths.add("/b/a/ss/vv/d");
            paths.add("/c/b/*/vv/d");
            paths.add("/a/a/vv/ss/d");
            paths.add("/b/a/vv/vv/d");
            paths.add("/c/a/vv/vv/d");
            TreeNode root = generateTree(paths);
            root.print("");
    //        long start = System.currentTimeMillis();
    //        long n = 100000000;
    //        while (n > 0) {
    //            isPass(root, "/c/b/vv/vv/d");
    //            n--;
    //        }
    //        System.out.println(100000000 / (System.currentTimeMillis() - start));
        }
    
        public static boolean isPass(TreeNode root, String path) {
            String[] vars = path.replaceFirst("/", "").split("/");
            TreeNode node = root;
            for (String var : vars) {
                if (node.getChilds().containsKey(var)) {
                    node = node.getChilds().get(var);
                    continue;
                }
                if (node.getChilds().containsKey("*")) {
                    node = node.getChilds().get("*");
                    continue;
                }
                return false;
            }
            return true;
        }
    
        public static TreeNode generateTree(List<String> paths) {
            TreeNode root = new TreeNode();
            for (String path : paths) {
                insertTree(root, path);
            }
            return root;
        }
    
        public static void insertTree(TreeNode root, String path) {
            String[] vars = path.replaceFirst("/", "").split("/");
            TreeNode node = root;
            for (String tmp : vars) {
                if (!node.getChilds().containsKey(tmp)) {
                    TreeNode tmpNode = new TreeNode();
                    node.getChilds().put(tmp, tmpNode);
    
                }
                node = node.getChilds().get(tmp);
            }
        }
    }
    
    @Data
    class TreeNode {
        private Map<String, TreeNode> childs = new HashMap();
    
        public void addChild(String key, TreeNode node) {
            this.childs.put(key, node);
        }
    
        public boolean isExist(String key) {
            return childs.containsKey(key);
        }
    
        public TreeNode getNode(List<String> keys) {
            TreeNode tmp = this;
            for (String key : keys) {
                tmp = tmp.getChilds().get(key);
            }
            return tmp;
        }
    
        public void print(String cpt) {
            if (childs.size() == 0) {
                System.out.println(cpt);
            } else {
                for (String key : childs.keySet()) {
                    childs.get(key).print(cpt + "/" + key);
                }
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 修改了问题 2月8日
  • 创建了问题 8月16日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测