You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅向访问过特定页面B的用户展示页面A内容,24小时后自动重置校验?

需求说明

存在A、B两个页面,用户访问页面A时,需要校验该用户IP是否曾在页面B被登记,才可以展示页面A的指定内容;该校验规则每24小时重置一次,重置后内容会重新隐藏,直到用户再次访问页面B才会再次展示。


前置说明

你最初的实现思路核心逻辑成立,但存在两个技术认知偏差:

  1. 前端代码无法直接获取用户的公网IP,只能由服务端拿到请求来源IP
  2. 前端无法直接跨页面读取另一个页面的内容,需要借助服务端做IP登记记录的存储和校验
    你提到的「Java」应该是混淆了JavaScript,本次实现仅用到极少量基础JS,复制即可用,不需要额外学习前端知识。

最简实现方案(适配C++技术栈)

1. 服务端实现(C++)

你可以用任意轻量C++ HTTP库完成,核心逻辑如下:

  • 定义全局存储结构,保存已登记的IP和对应的登记时间戳
  • 提供三个路由:
    • 返回页面A的静态内容
    • 返回页面B的静态内容,同时把请求来源IP和当前时间戳存入存储结构
    • 校验接口:接收请求,判断来源IP是否在存储结构中、且当前时间和登记时间差小于86400秒(24小时),返回布尔结果
  • 可选:每次接口调用时清理掉超过24小时的过期IP记录,节省存储空间

示例代码片段:

// 引入HTTP库头文件,用单头文件的轻量库即可直接运行
#include <httplib.h>
#include <unordered_map>
#include <string>
#include <chrono>

using namespace std;
unordered_map<string, long long> ip_record;

int main() {
    httplib::Server svr;

    // 页面B路由
    svr.Get("/pageB", [](const httplib::Request &req, httplib::Response &res) {
        // 获取请求来源IP
        string user_ip = req.remote_addr;
        // 记录当前时间戳(秒)
        auto now = chrono::system_clock::now();
        long long timestamp = chrono::duration_cast<chrono::seconds>(now.time_since_epoch()).count();
        ip_record[user_ip] = timestamp;
        // 返回页面B的HTML内容
        res.set_content(R"(
<!-- 页面B的HTML内容,可自行修改 -->
<!DOCTYPE html>
<html>
<body>
<h1>页面B</h1>
<p>你的IP已经登记,24小时内可访问页面A的隐藏内容</p>
</body>
</html>
        )", "text/html");
    });

    // 页面A路由
    svr.Get("/pageA", [](const httplib::Request &req, httplib::Response &res) {
        // 返回页面A的HTML内容
        res.set_content(R"(
<!DOCTYPE html>
<html>
<body>
<h1>页面A</h1>
<div id="hidden_content" style="display:none;">
这是只有登记过IP才能看到的隐藏内容
</div>
<script>
// 页面加载时调用校验接口
fetch('/check_ip')
.then(res => res.json())
.then(data => {
    if(data.allow) {
        document.getElementById('hidden_content').style.display = 'block';
    }
})
</script>
</body>
</html>
        )", "text/html");
    });

    // IP校验接口
    svr.Get("/check_ip", [](const httplib::Request &req, httplib::Response &res) {
        string user_ip = req.remote_addr;
        bool allow = false;
        auto now = chrono::system_clock::now();
        long long now_ts = chrono::duration_cast<chrono::seconds>(now.time_since_epoch()).count();
        // 检查IP是否存在且未过期
        if(ip_record.count(user_ip) && (now_ts - ip_record[user_ip] < 86400)) {
            allow = true;
        }
        // 返回JSON结果
        res.set_content("{\"allow\":" + string(allow ? "true" : "false") + "}", "application/json");
    });

    svr.listen("0.0.0.0", 8080);
    return 0;
}

2. 运行验证

  • 编译运行上面的C++服务端代码
  • 访问 http://你的服务地址:8080/pageB 完成IP登记
  • 访问 http://你的服务地址:8080/pageA 即可看到隐藏内容
  • 24小时后再次访问页面A,内容会自动隐藏,重新访问页面B即可恢复

注意事项
  • 上述是最简实现,生产环境使用建议把IP存储换成持久化数据库/缓存,避免服务重启数据丢失
  • 如果用户IP是动态分配的,可能出现校验失效,对安全性要求高可以换成IP+浏览器Cookie结合的校验方式
  • 可以根据需求自行修改两个页面的HTML内容,不需要改动核心逻辑

内容的提问来源于stack exchange,提问作者nudi amid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 23:03:01