首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在应用程序运行时从.txt更新哈希集

问在应用程序运行时从.txt更新哈希集
EN

Stack Overflow用户
提问于 2022-05-13 14:42:55
回答 2查看 57关注 0票数 0

目标是阻止IP地址列表中对页面的访问。此列表位于文件list.txt中。我创建了一个服务,用于检查来自请求的IP,并使用HashSet检查“不想要的”地址,但是子目标是“动态捕获”这个list.txt。我的意思是:如果我在这个文件中添加了一些IP,它应该在不重新启动应用程序的情况下被阻止。我不知道如何解决这个问题,因为我的应用程序只有在重启后才刷新这个列表。我的代码在下面

代码语言:javascript
复制
    @Service
public class BlackListService {

    public Set<String> loadBlackList() {
        java.util.Set<java.lang.String> blackList = new HashSet<>();
        InputStream resource = null;
        try {
            resource = new ClassPathResource(
                    "blacklist.txt").getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {
            blackList = reader.lines().collect(Collectors.toSet());
            for (java.lang.String address:
                    blackList) {
                System.out.println(address);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return blackList;
    }

    public boolean isNowAllowedIP(Set<String> blackList, String requestIP) {
        return blackList.contains(requestIP);
    }

}

主计长:

代码语言:javascript
复制
@Controller
public class MainController {

    private final BlackListService blackListService;

    public MainController(BlackListService blackListService) {
        this.blackListService = blackListService;
    }

    @GetMapping("/")
    public String mainPage(HttpServletRequest request, Model model) {
        Set<String> blackList = blackListService.loadBlackList();

        if (blackListService.isNowAllowedIP(blackList, request.getRemoteAddr())) {
            Logger logger = Logger.getLogger("Access logs");
            logger.warning("Access disallowed");
            model.addAttribute("message", request.getRemoteAddr() + ": Access disallowed");
            return "index";
        }
        model.addAttribute("message", "Access allowed");
        return "index";
    }

}

有人能帮忙完成这个“子目标”吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-19 15:35:33

在loadBlackList()中,您正在从类路径读取资源。这可能是获取一个内置到jar文件中的文件,还是构建不是您正在编辑的文件的dir?我将尝试更改loadBlackList()以使用FileReader和文件系统上的路径,而不是类路径中的路径,而不是InputStreamReader。

票数 0
EN

Stack Overflow用户

发布于 2022-05-13 15:07:01

您需要的是一个重复的背景作业,将重新加载您的黑名单后,您更改它。这个博客将讨论一种用Spring实现它的“现代”方法。

  • 保存上一次修改文件的时间时,您的程序启动,并首次加载它。有关检查文件修改时间,请参见这。
  • 将后台作业安排为每分钟运行一次(或5分钟或任何足够频繁地运行以满足您的需要)。
  • 作业运行时,检查文件上的当前更新时间,如果与保存的时间不同,则重新加载列表的时间。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72231412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档