如何仅向访问过特定页面B的用户展示页面A内容,24小时后自动重置校验?
需求说明
存在A、B两个页面,用户访问页面A时,需要校验该用户IP是否曾在页面B被登记,才可以展示页面A的指定内容;该校验规则每24小时重置一次,重置后内容会重新隐藏,直到用户再次访问页面B才会再次展示。
前置说明
你最初的实现思路核心逻辑成立,但存在两个技术认知偏差:
- 前端代码无法直接获取用户的公网IP,只能由服务端拿到请求来源IP
- 前端无法直接跨页面读取另一个页面的内容,需要借助服务端做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
相关产品推荐
相关产品推荐

