当前位置: 首页 > 编程日记 > 正文

关于登录记住密码使用cookie的详解

下面是我看的一篇文章引用过来,很易懂

设置cookie
每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie:
document.cookie="userId=828";
如果要一次存储多个名/值对,可以使用分号加空格(; )隔开,例如:
document.cookie="userId=828; userName=hulk";
在cookie的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做

到这点很容易,但要保存的值是不确定的。如何来存储这些值呢?方法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于

cookie值中,而且使用此种方案还可以避免中文乱码的出现。例如:
document.cookie="str="+escape("I love ajax");
相当于:
document.cookie="str=I%20love%20ajax";
当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值。

尽管document.cookie看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句:
document.cookie="userId=828";
document.cookie="userName=hulk";
这时浏览器将维护两个cookie,分别是userId和userName,因此给document.cookie赋值更像执行类似这样的语句:
document.addCookie("userId=828");
document.addCookie("userName=hulk");
事实上,浏览器就是按照这样的方式来设置cookie的,如果要改变一个cookie的值,只需重新赋值,例如:
document.cookie="userId=929";
这样就将名为userId的cookie值设置为了929。

获取cookie的值
下面介绍如何获取cookie的值。cookie的值可以由document.cookie直接获得:
var strCookie=document.cookie;
这将获得以分号隔开的多个名/值对所组成的字符串,这些名/值对包括了该域名下的所有cookie

<script language="JavaScript" type="text/javascript">
<!--
document.cookie="userId=828";
document.cookie="userName=hulk";
var strCookie=document.cookie;
alert(strCookie);
//-->
</script>

名称来获得指定的值,这正是处理cookie值最麻烦的一部分。用户必须自己分析这个字符串,来获取指定的cookie值,例如,要获取userId的值,可以这样实现:

<script language="JavaScript" type="text/javascript">
<!--
//设置两个cookie
document.cookie="userId=828";
document.cookie="userName=hulk";
//获取cookie字符串
var strCookie=document.cookie;
//将多cookie切割为多个名/值对
var arrCookie=strCookie.split("; ");
var userId;
//遍历cookie数组,处理每个cookie对
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
//找到名称为userId的cookie,并返回它的值
if("userId"==arr[0]){
userId=arr[1];
break;
}
}
alert(userId);
//-->
</script>

用类似的方法,可以获取一个或多个cookie的值,其主要的技巧仍然是字符串和数组的相关操作.

给cookie设置终止日期
到现在为止,所有的cookie都是单会话cookie,即浏览器关闭后这些cookie将会丢失,事实上这些cookie仅仅是存储在内存中,而没有建立相应的硬盘文件。
在实际开发中,cookie常常需要长期保存,例如保存用户登录的状态。这可以用下面的选项来实现:
document.cookie="userId=828; expires=GMT_String";
其中GMT_String是以GMT格式表示的时间字符串,这条语句就是将userId这个cookie设置为

GMT_String表示的过期时间,超过这个时间,cookie将消失,不可访问。例如:如果要将cookie

设置为10天后过期,可以这样实现:

<script language="JavaScript" type="text/javascript">
<!--
//获取当前时间
var date=new Date();
var expireDays=10;
//将date设置为10天以后的时间
date.setTime(date.getTime()+expireDays*24*3600*1000);//或者也可以用 date.setDate(date.getDate+expireDays)
//将userId和userName两个cookie设置为10天后过期
document.cookie="userId=828; userName=hulk; expire="+date.toGMTString();
//-->
</script>


删除cookie
为了删除一个cookie,可以将其过期时间设定为一个过去的时间,例如:

<script language="JavaScript" type="text/javascript">
<!--
//获取当前时间

var date=new Date();
//将date设置为过去的时间

date.setTime(date.getTime()-10000);
//将userId这个cookie删除

document.cookie="userId=828; expire="+date.toGMTString();
//-->
</script>

指定可访问cookie的路径
默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问该cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在

www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html/b.html或

www.xxx.com/ html/ some/c.html所访问,但不能被www.xxxx.com/d.html访问。
为了控制cookie可以访问的目录,需要使用path参数设置cookie,语法如下:
document.cookie="name=value; path=cookieDir";
其中cookieDir表示可访问cookie的目录。例如:
document.cookie="userId=320; path=/shop";
就表示当前cookie仅能在shop目录下使用。
如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如:
document.cookie="userId=320; path=/";


指定可访问cookie的主机名
和 路径类似,主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下, 一个主机中创建的cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为:
document.cookie="name=value; domain=cookieDomain";
以google为例,要实现跨主机访问,可以写为:
document.cookie="name=value;domain=.google.com";
这样,所有google.com下的主机都可以访问该cookie。


综合示例:构造通用的cookie处理函数
cookie的处理过程比较复杂,并具有一定的相似性。因此可以定义几个函数来完成cookie的通用

操作,从而实现代码的复用。下面列出了常用的cookie操作及其函数实现。
1.添加一个cookie:addCookie(name,value,expireHours)
该函数接收3个参数:cookie名称,cookie值,以及在多少小时后过期。这里约定expireHours为0时不设定过期时间,即当浏览器关闭时cookie自动消失。该函数实现如下:

<script language="JavaScript" type="text/javascript">
<!--
function addCookie(name,value,expireHours){
var cookieString=name+"="+escape(value);
//判断是否设置过期时间


if(expireHours>0){
var date=new Date();
date.setTime(date.getTime+expireHours*3600*1000);
cookieString=cookieString+"; expire="+date.toGMTString();
}
document.cookie=cookieString;
}
//-->
</script>

2.获取指定名称的cookie值:getCookie(name)
该函数返回名称为name的cookie值,如果不存在则返回空,其实现如下:

<script language="JavaScript" type="text/javascript">
<!--
function getCookie(name){
var strCookie=document.cookie;
var arrCookie=strCookie.split("; ");
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
if(arr[0]==name)return arr[1];
}
return "";
}
//-->

function getCookie(cookie_name){
var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');

if (results)
return (unescape(results[2]));
else
return null;
}
</script>

3.删除指定名称的cookie:deleteCookie(name)
该函数可以删除指定名称的cookie,其实现如下:

<script language="JavaScript" type="text/javascript">
<!--
function deleteCookie(name){
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=v; expire="+date.toGMTString();
}
//-->
</script>

转载于:https://www.cnblogs.com/dylanblog/p/4453869.html

相关文章:

Linux服务器---安装tftp-server

安装tftp-server1、安装tftp-server[rootlocalhost weijie]# yum install -y tftp-serverLoaded plugins: fastestmirror, refresh-packagekit, securityRunning TransactionInstalling : tftp-server-0.49-8.el6.i686 1/1 Verifying : tftp…

linux指令 2>1 到底是个啥

训练好深度学习模型之后对其进行测试&#xff0c;测试的脚本如上图。 我对第11行感到不解&#xff0c;经过检索Linux重定向和文件描述符相关知识后&#xff0c;明白了 2代表着标准错误 1代表者标准输出(默认是屏幕) >代表流向 那么第11行代码的含义也就是&#xff0c;将…

新生 语不惊人死不休 —— 《无限恐怖》读后有感

开篇声明&#xff0c;我博客中“小心情”这一系列&#xff0c;全都是日记啊随笔啊什么乱七八糟的。如果一不小心点进来了&#xff0c;不妨直接关掉。我自己曾经写过一段时间的日记&#xff0c;常常翻看&#xff0c;毫无疑问我的文笔是很差的&#xff0c;而且心情也是瞬息万变的…

中国大学MOOC-C程序设计(浙大翁恺)—— 时间换算

时间换算&#xff08;10分&#xff09;题目内容&#xff1a;UTC是世界协调时&#xff0c;BJT是北京时间&#xff0c;UTC时间相当于BJT减去8。现在&#xff0c;你的程序要读入一个整数&#xff0c;表示BJT的时和分。整数的个位和十位表示分&#xff0c;百位和千位表示小时。如果…

作为一个程序员,数学对你到底有多重要(转)

每个计算机系毕业的人&#xff0c;大都学过不少数学课&#xff0c;而且不少学校的计算机系的数学课&#xff0c;通常比一般的其他工科专业的数学要难一些&#xff0c;比如不上高等数学&#xff0c;而是学数学分析&#xff0c;不上线性代数而去上高等代数。但是&#xff0c;大部…

如何在vsc上选择远程miniconda特定的虚拟环境中的Python解释器(4步)

前提&#xff1a; 已经通过remote development插件连上了远程服务器 远程服务器上已经创建了安装了python的虚拟环境 步骤&#xff1a; 点击“查看” 点击“命令面板” 输入/选择 Python:Select Interpreter 然后就能选择远程miniconda中已经创建的虚拟环境了 我的minico…

Java数据类型简单认识

Java是一种强类型编程语言&#xff0c;因而在声明变量的时候必须声明数据类型&#xff0c;java语言有基本数据类型和引用数据类型这两大数据类型&#xff0c;基本数据类型有8种分别是4种整型、2种浮点类型、1种用于Unicode表示字符单元的字符类型和1种表示真值的布尔类型;引用数…

Intel 6系列芯片组设计缺陷 全球出货暂停

美国当地时间周一&#xff0c;Intel公司官方宣布&#xff0c;今年1月初刚刚伴随Sandy Bridge系列“第二代Core架构处理器”推出的6系列芯片组&#xff08;代号Cougar Point&#xff09;发现了设计方面的问题。虽然目前Intel已经对该设计在芯片级别进行了修正&#xff0c;但在新…

PrestaShop 网站漏洞修复如何修复

2019独角兽企业重金招聘Python工程师标准>>> PrestaShop网站的漏洞越来越多&#xff0c;该网站系统是很多外贸网站在使用的一个开源系统&#xff0c;从之前的1.0初始版本到现在的1.7版本&#xff0c;经历了多次的升级&#xff0c;系统使用的人也越来越多&#xff0c…

shell脚本中的case语句使用要点

1.双分号(;;) 用于case语句中一个分支的结束。 可类比C里面switch...case语句&#xff0c;在case语句之后&#xff0c;若所有语句都输完&#xff0c;后面跟着的"break;"。 2.星号加右小括号*) 可类比C里面switch...case语句中的"default:"。 3.结束符…

Netty - ByteBuf

2019独角兽企业重金招聘Python工程师标准>>> 1.ByteBuf类 - Netty的数据容器 ByteBuf维护了两个不同的索引&#xff1a; readerIndex&#xff1a;用于读取writerIndex&#xff1a;用于写入起始位置都从0开始&#xff1a; 名称以read或者write开头的方法会更新ByteBu…

不要做浮躁的嵌入式系统工程师

每天读一遍&#xff0c;思考一下&#xff1a;我是否浮躁&#xff1f; 1、不要看到别人的回复&#xff0c;第一句话就说&#xff1a;给个代码吧&#xff01;你应该想想为什么。当你自己想出来再参考别人的提示&#xff0c;就会知道自己和别人思路的差异。 2、初学者请不要看…

Codeforces Round #300 A. Cutting Banner 水题

A. Cutting Banner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/problem/ADescription A large banner with word CODEFORCES was ordered for the 1000-th onsite round of Codeforcesω that takes place on the Miami beach. Unfo…

ImportError:cannot import name ‘display‘ File “XX“, line 5, in <module> from IPython import display

导入错误问题的一个解决思路是&#xff0c;推断这是模块间版本不兼容带来的问题&#xff0c;先把模块卸载掉&#xff0c;再用conda install安装上。也就是让conda去协调模块间兼容性。

[高级]android应用开发之intent的妙用二

相信做android应用开发的朋友对intent组件都已经是相当熟悉了&#xff0c;这里鄙人总结一下intent的妙用&#xff0c;希望对大家有帮助。 intent妙用之列出所有已安装的应用程序列表 装载&#xff1a;http://blog.csdn.net/android_tutor/article/details/5724634 这篇文章写的…

windows 自动化目录大纲(各企业架构不一样,按需选择)

有需要做自动化的联系979122932,一起交流学习转载于:https://blog.51cto.com/7763608/2338668

Java设计模式之虚拟代理模式

描述&#xff1a;虚拟代理模式(Virtual Proxy)是一种节省内存的技术&#xff0c;它建议创建那些占用大量内存或处理复杂的对象时&#xff0c;把创建这类对象推迟到使用它的时候。在特定的应用中&#xff0c;不同部分的功能由不同的对象组成&#xff0c;应用启动的时候&#xff…

(已解决)ImportError attempted relative import with no known parent package

想要调用同一目录下的另一个py文件中的类&#xff0c;以下或许是可行的解决方案。 需要做到两点 1. 将主调文件的名称改为__init__.py 2. from 被调文件的文件名称(删去末尾.py) import 类名 不要在被调文件的文件名称前面加点&#xff01; 我的目录结构 我的调用方式 fro…

小红点功能控件

写在前面 本意是想把做过的东西沉淀一下&#xff0c;防止重复造轮子。后来想想自己在实现这个的过程中还是走了一点弯路的。虽然网上找的轮子很多&#xff0c;其实大多都华而不实或者功能太多&#xff0c;工作中实现的东西最重要的不是功能炫&#xff0c;而是稳定&#xff0c;一…

根据条件查找数组中的一条数据并放入缓存

protected MemberInfo GetCacheMemberInfo(string userName) { MemberInfo minfo new MemberInfo();//实体 minfo System.Web.HttpRuntime.Cache.Get("HotPP_" userName) as MemberInfo;//读缓存 if (minfo null) { M…

看我如何下载韩寒博客文章笔记

str()将整型数据转化为字符型数据转载于:https://www.cnblogs.com/sunshinewxz/p/4461432.html

怎样知道pip install 可以安装包的哪些版本

方法一&#xff1a; 思路很清晰&#xff0c;故意不给版本号&#xff0c;然后系统就告诉你&#xff0c;这样不行呀&#xff0c;可以用以下XX,XX,XX版本号 例如安装torchtext

异步编程之Promise(2):探究原理

异步编程系列教程&#xff1a; (翻译)异步编程之Promise(1)——初见魅力异步编程之Promise(2)&#xff1a;探究原理异步编程之Promise(3)&#xff1a;拓展进阶异步编程之Generator(1)——领略魅力异步编程之Generator(2)——剖析特性异步编程之co——源码分析动手实现Promise 在…

PC端、移动端手机竖拍原图压缩上传顺时针旋转90°的解决方案

问题背景 最近在做的项目中&#xff0c;不管是移动端还是后台系统都涉及到了手机照片压缩上传的问题&#xff0c;做完功能测试的时候发现图片回显的时候有些顺时针旋转了90&#xff08;竖拍照片&#xff0c;不管是ios还是android都存在这问题&#xff09;&#xff0c;后来百度了…

perl:cpanm安装方式的一种取代方法

笔者现在有一个cpanfile&#xff0c;里面需要安装的perl模块&#xff0c;github的作者给出的指令是 cpanm --installdeps . 而笔者的服务器没有cpanm&#xff0c;因为不是管理员也无法用apt安装 经过一番搜索&#xff0c;发现以下的替代方式&#xff1a; 依次在命令行输入 1…

elementUI源码修改的爬坑之旅

今天由于项目需要&#xff0c;想在Tree组件的前面增加一个icon图标&#xff0c;根据不同类型增加不同的图标&#xff0c;我修改了elementUI的源代码&#xff0c;发布到npm上去成功使用&#xff0c;记录下过程中所碰到的问题&#xff0c;首先看下最后的效果&#xff1a; 下面简单…

Sublime text3 快捷方式(windows平台)

1.Goto Anything-快速查找&#xff08;ctrl P&#xff09; 输入函数名可以快速找到函数输入#文本可以快速进行文件内文本匹配2.命令模式CtrlShiftP&#xff1a;打开命令面板 CtrlP&#xff1a;搜索项目中的文件 CtrlW&#xff1a;关闭当前打开文件 CtrlShiftW&#xf…

(已解决)ubuntu20.04 jar xvf XXX.zip报错-java.io.EOFException:Unexpected end of ZLIB input stream

报错截图 如下 我在服务器上解压缩defects4j-repos.zip&#xff0c;但是出现了如上错误。通过SFTP我把这个压缩包传到了本地win10上面&#xff0c;进行解压缩。本地解压缩软件(有图形界面的好处显现了)告诉我这个文件已经损坏。 原因分析 由于运行脚本涉及到一堆的文件下载&am…

Linux上传和下载

下载&#xff1a;sz 上传&#xff1a;rz

joomla网页无任何显示输出

joomla配置环境&#xff1a;LAMP 先打开php.ini display_errorsOn 网页显示报错 Class DOMDocument not found *********** 解决方法&#xff1a; 1.安装php-xml #yum install php-xml 2.重启apache&#xff08;CentOS&#xff09; #service httpd restart转载于:https://www…