您的位置:首页 > Web前端 > JavaScript

.Net Framework Cookie 和 JS localStorage使用

2020-05-12 16:11 84 查看

.Net Framework Cookie 和 JS localStorage使用

背景:
下载万方文档,要求每月有次数限制,超过20次不可以下载,
以前是每点一次在线阅读,下载全文都计数,并且有重复记录的bug。

解决方案
引入Cookie,将文献ID和到期时间记录到Cookie,五分钟内针对同一篇文章不做计数,五分钟以后重新计数并及重新计时。

原理
Cookie设置到期时间后,到期自动清除,并不受用户关闭浏览器影响。

Code

private bool IsAddCount(HttpContext context)
{
string id = HttpUtility.UrlDecode(context.Request["id"]),
title = HttpUtility.UrlDecode(context.Request["title"]);

//读取Cookie, 过期浏览器自动清除, 5min之内不计入次数
if (context.Request.Cookies["wfArticle_" + id] != null)
{
var sessionid = context.Request.Cookies["wfArticle_" + id];
return false;
}
else
{
//过期重新记录
System.Web.HttpCookie newcookie = new HttpCookie("wfArticle_" + id);
newcookie.Values["id"] = id;
newcookie.Values["title"] = title;
newcookie.Expires = DateTime.Now.AddMinutes(5);
context.Response.AppendCookie(newcookie);
}
return true;
}

Cookie时间没法从浏览器传到后台,浏览器只根据过期时间管理Cookie

Cookie被修改了Chrome兼容,微信浏览器更新不了Cookie

Cookie具体值如图

隐藏的Bug
然而上线发布到服务器,并不能成功更改Cookie,于是我想着删掉Cookie,再创建同名Cookie,测试Chrome好用,但发布到服务器,IOS手机端微信访问依然删不掉Cookie,更别提更新了。笔者几乎崩溃,同事建议LocalStorage替代,微信浏览器好用,我偏不信这个邪,于是想着每次Expired后新建Cookie加时间戳,这样他就不需要删除,每上一个Cookie记录下一个Cookie的时间戳,这种链表的结构,但是问题是无法确定链表的指针节点,最终笔者妥协了,上localStorage。

var opId = $("#hd_openId").val();
var isAddCount = "true";
var now = new Date();
var lastDateStr = window.localStorage.getItem(aid);
var lastDate = new Date(lastDateStr);
var minutes = lastDate.getMinutes();
lastDate.setMinutes(minutes + 5);
var ExpiredDate = lastDate;
if (ExpiredDate > now) {
isAddCount = "false";
}
else {
isAddCount = "true";
window.localStorage.setItem(aId, now);
}

最后将IsAddCount传到后台直接做判断是否需要更新Count计数,

总结
本来一天改完的Bug改了两天,第一天踩了个微信浏览器的坑,方向性错误。希望对遇到同样问题的小伙伴有帮助。

如有侵权请联系我删除,仅供学习参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐