本文目录一览:
- 用javascript设置了cookie,ajax请求却不生效的问题
- [php js跨域请求,并设置cookies](#php js跨域请求,并设置cookies)
- nodejs怎么设置cookie
- js怎么设置cookie得到cookie删除cookie
- 如何用js来操作cookie呢?
- JS里的POST方法如何设置cookie?
用javascript设置了cookie,ajax请求却不生效的问题
在用JavaScript发送ajax请求时增加cookie的方法如下:
$.ajax({
type: "POST",
url: URL,
data: SOAP_INBOX_MAIL_QUERY,
dataType: "xml",
async: false,
beforeSend: function(xhr) {
var cookie = credentials["COOKIE"]; //此处设置cookie
console.info("adding cookie: " + cookie);
xhr.setRequestHeader('Cookie', cookie);
},
success: function(data, textStatus, xmLHttpRequest) {
},
error: function(xhr, ajaxOptions, thrownError) {
credentials = null;
}
});
php js跨域请求,并设置cookies
首先要说的是,阁下的问题看起颇费神,中文英文符号混杂,大小写混杂,让阅读者看起相当吃力。 其次,你跨域,JS不能使用POST和GET请求的,这是浏览器安全规则,不过可以使用其它办法来获得类似结果。 JS跨域,POST可以通过提交隐藏表单至隐藏框架页来得到请求结果。而GET请求则可以在目标地址后面加上要请求的GET参数然后抓取目标页的所有网页内容,再通过正则处理获得结果;也可以使用JSON来获取(详情请自行学习JSON,很简单的)。 阁下的问题,只是获取COOKIE时间,那么可以直接通过JS抓取目标页或JSON获得。而B域名的cookies.php,完全不需要访问index.php来获得上一个COOKIE的时间,因为它们是同一个站,index.php能访问到的COOKIE,cookies.php也能访问到。 B域名的cookies.php参考如下(仅供参考,具体请根据自己情况另行写代码):
if (isset($_COOKIE["user"]))
$time = $_COOKIE["user"];
else
$time = 0;
$_COOKIE["user"] = time();
echo $time;
//或输出JSON,请自行学习 终上,仅是提供一个思路,更多的还是要靠阁下自行摸索学习。 另外,这种跨域请求,建议使用JSON,因为它简单方便。当你学会了,就表示你会写接口和使用接口了(虽然这个只是最简单的接口)。当然除了JSON还可以使用XML,只是性能稍差一些,也不错
nodejs怎么设置cookie
通过node.js建立了一个完整的网站不是一件容易的事,这涉及读取页面模板,从数据库中抽出数据构建成新的页面返回给客户端。但光是这样还不行,我们还要设置首部,在chrome中如果CSS没有设置正确的Content-Type,会不起作用的。此处理还要考虑访问量,要设置缓存,缓存不单单是把东西从内存中读入读出就行,这样会撑爆电脑内存的,这用LRU算法(最近最少用的数据会清空出内存)。基于Cookie与数据库与URL重写,我们发展出一个session机制用于在多个action中通信。对于不同的请求交由不同的action来处理,就要发展出路由机制与MVC系统,等等。我信后写这些东西一点点写出来,揭示newland.js中遇到的种种问题与解决方案。如果什么都贪图方便,直接上框架,对我们语言学习是非常不利的。 本文正如标题所说,是操作Cookie。下面是一个完整的例子:
var http = require('http');
http.createServer(function(req, res) {
// 获得客户端的Cookie
var Cookies = {};
req.headers.cookie.split(';').forEach(function(Cookie) {
var parts = Cookie.split('=');
Cookies[parts[0].trim()] = (parts[1] || '').trim();
});
console.log(Cookies)
// 向客户端设置一个Cookie
res.writeHead(200, {
'Set-Cookie': 'myCookie=test',
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(8000);
console.log('Server running at ');
如果去掉其中几句,就是官方给出的例子,除了表明返回一个页面多简单外,一点用也没有。
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8000);
console.log('Server running at ');
我们通过http.createServer的回调来处理所有请求与响应,因此什么有用的东西都在它们上面。Cookie位于req对象的headers对象上,为一个字符串,通常为了方便我们将它们转换成一个对象。 写入一个Cookie其实就是在首部设置一个键值对,上面是简单方式,它实际上可以这样:
res.writeHead(200, {
'Set-Cookie': ["aaa=bbb","ccc=ddd","eee=fff"],
'Content-Type': 'text/plain'
});
但真正使用时,我们的Cookie并非这样简单的的格式:
Set-Cookie: =[; =][; expires=][; domain=][; path=][; secure][; HttpOnly]
HttpOnly 属性: 这是微软对Cookie做的扩展。如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
var http = require('http');
http.createServer(function(req, res) {
// 获得客户端的Cookie
var Cookies = {};
req.headers.cookie.split(';').forEach(function(Cookie) {
var parts = Cookie.split('=');
Cookies[parts[0].trim()] = (parts[1] || '').trim();
});
console.log(Cookies)
// 向客户端设置一个Cookie
res.writeHead(200, {
'Set-Cookie': 'SSID=Ap4GTEq; Expires=Wed, 13-Jan-2021 22:23:01 GMT;HttpOnly ',
'Content-Type': 'text/html'
});
res.end('Hello World\n<script>console.log(document.Cookie)</script>');
}).listen(8000);
console.log('Server running at ');
然后多刷几次页面,我们发现我们还能在控制台看到SSID=Ap4GTEq这个属性,但在前端我们看不到它(当然在firebug中能看到)。 Secure属性: 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。同上,在客户端我们也无法在document.Cookie找到被设置了Secure=true的Cookie键值对。Secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取Cookie后进行攻击。我们可以把Secure=true看成比HttpOnly更严格的访问控制。 path属性: 指定可访问Cookie的目录。例如:"userId=320; path=/shop";就表示当前Cookie仅能在shop目录下使用。 domain属性: 指定可访问Cookie的主机名.主机名是指同一个域下的不同主机,例如:和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的Cookie在另一个主机下是不能被访问的, 但可以通过domain参数来实现对其的控制,其语法格式为:"name=value; domain=CookieDomain";以google为例,要实现跨主机访问,可以写为: "name=value;domain=.google.com";这样,所有google.com下的主机都可以访问该Cookie。 Expires属性:指定过期时间,格式为"name=value;; expires=GMT_String"; 其中GMT_String是以GMT格式表示的时间字符串,超过这个时间,Cookie将消失,不可访问。例如:如果要将Cookie设置为10天后过期,可以这样实现:
//获取当前时间
var date = new Date();
var expireDays = 10;
//将date设置为10天以后的时间
date.setTime(date.getTime() + expireDays * 24 * 3600 * 1000);
//将userId和userName两个Cookie设置为10天后过期
res.writeHead(200, {
'Set-Cookie': "userId=828; userName=hulk; expire=" + date.toGMTString(),
'Content-Type': 'text/html'
});
Max-Age属性: 个人感觉这个东西比Expires更好用,本来就是用于代替Expires,由于市面上的书你抄我,我抄你,都在抄旧知识,导致Expires还在使用。Max-Age的值 可以为正数,表示此Cookie从创建到过期所能存在的时间,以秒为单位,此Cookie会存储到客户端电脑,以Cookie文件形式保存,不论关闭浏览器或关闭电脑,直到时间到才会过期。 可以为负数,表示此Cookie只是存储在浏览器内存里,只要关闭浏览器,此Cookie就会消失。maxAge默认值为-1。 还可以为0,表示从客户端电脑或浏览器内存中删除此Cookie。 Cookie面向的主要是服务器,localstorage面向的是页面端js。页面所需的业务数据可以放在localstorage里,但是认证相关的信息还是需要放在Cookie里的。
Cookie的限制
一、浏览器允许每个域名所包含的 Cookie 数:
- Microsoft 指出 Internet Explorer 8 增加 Cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 个 Cookie(《Update to Internet Explorer’s Cookie Jar》)。
- Firefox 每个域名 Cookie 限制为 50 个。
- Opera 每个域名 Cookie 限制为 30 个。
- Safari/WebKit 貌似没有 Cookie 限制。但是如果 Cookie 很多,则会使 header 大小超过服务器的处理的限制,会导致错误发生。 二、当很多的 Cookie 被设置,浏览器如何去响应。除 Safari(可以设置全部Cookie,不管数量多少),有两个方法:
- 最少最近使用(least recently used (LRU))的方法:当 Cookie 已达到限额,自动踢除最老的 Cookie ,以使给最新的 Cookie 一些空间。 Internet Explorer 和 Opera 使用此方法。
- Firefox 很独特:虽然最后的设置的 Cookie 始终保留,但似乎随机决定哪些 Cookie 被保留。似乎没有任何计划(建议:在 Firefox 中不要超过 Cookie 限制)。 三、不同浏览器间 Cookie 总大小也不同:
- Firefox 和 Safari 允许 Cookie 多达 4097 个字节, 包括名(name)、值(value)和等号。
- Opera 允许 Cookie 多达 4096 个字节, 包括:名(name)、值(value)和等号。
- Internet Explorer 允许 Cookie 多达 4095 个字节, 包括:名(name)、值(value)和等号。 注:多字节字符计算为两个字节。在所有浏览器中,任何 Cookie 大小超过限制都被忽略,且永远不会被设置。 最后让我们看看newland.js是怎么处理cookie的。 newland.js有个重要的对象叫httpflow,其实就是我的操作流flow的子类,它劫持了所有请求与响应。当一个请求过来时,框架就会new一个httpflow去处理它们。它有个patch方法,用于为操作流添加一些有用属性与方法,而不像express.js那样直接在原生对象上改。实现express.js现在的做法有点像Prototype.js,加之node.js的版本现在还没有到1.0,因此API改动还很频繁的。express.js的行为无异走钢线。而把操作移到一个自定义对象就安全多了。
// 源码见
http.createServer(function(req, res) {
var flow = new Flow() //创建一个流程对象,处理所有异步操作,如视图文件的读取、数据库连接
flow.patch(req, res)
services.forEach(function(fn){
fn(flow); //将拦截器绑到流程对象上
});
//...
})
此外,httpflow还劫持res.writeHead,res.setHeader,目的为实现多次调用setCookie时而不相互覆盖。
// 源码见
patch: function(req, res){
this.res = res;
this.req = req;
this.originalUrl = req.url;
this.params = {};
this.session = new Store(this);
this.flash = function(type, msg){
//。。。。。
}
var flow = this;
var writeHead = res.writeHead;
var setHeader = res.setHeader;
flow._setHeader = setHeader;
res.writeHead = function(){
flow.fire('header');
writeHead.apply(this, arguments);
this.writeHead = writeHead; //还原
}
res.setHeader = function(field, val){
var key = field.toLowerCase()
if ('set-cookie' == key) {
var array = typeof val == "string" ? [val] : val;
array.forEach(function(str){
var arr = str.split("=");
flow.addCookie(arr[0], arr[1])
})
} else{
if ('content-type' == key && this.charset) {
val += '; charset=' + this.charset;
}
setHeader.call(this, field, val);
}
}
}
此外操作流还有两个有用的方法来添加或移除Cookie。
// 源码见
addCookie: function(name, val, opt){
if(!this.resCookies){
this.resCookies = {};
this.resCookies[name] = [val, opt];
this.bind("header", function(){
var array = [];
for(var i in this.resCookies){
var arr = this.resCookies[i];
array.push(Cookie.stringify(i, arr[0], arr[1]));
}
this._setHeader.call(this.res, "Set-Cookie", array);
});
} else {
this.resCookies[name] = [val, opt];
}
return this;
},
removeCookie: function(name){
var cookies = Array.isArray(name) ? name : [ name ];
cookies.forEach(function(cookie){
this.addCookie(cookie, "", 0);
}, this);
return this;
},
实质上,经过上面的代码,我们就好方便多次添加或删除Cookie。个人认为用setHeader来操作(即使它已经被偷龙转凤还是不怎么好用),大家还是用addCookie, removeCookie来干吧。这些操作会在用户第一次调用当前的res.whireHead生效!
flow.addCookie("ACookie","xxxxxxxxxx");
flow.addCookie("BCookie","yyyyyyyyy");
flow.addCookie('rememberme', 'yes', { expires: 0, httpOnly: true });
//链式写法,同名cookie前者会覆盖后者的,前端只生成“aaa=2; bbb=1”
flow.addCookie("aaa",1).addCookie("aaa",2).addCookie("bbb",1).addCookie("bbb",1);
flow.res.setHeader("Set-Cookie","user=aaa");
flow.removeCookie("oldCookie");
//传入一个字符串数组,同时删除多个cookie
flow.removeCookie(["myCookie","uuer","newCookie"]);
如果你想查看从客户端来的cookie,那么直接看flow.cookie好了,它会在途中调用一个get_cookie的服务,将原始的字符始形式转换为一个对象。
js怎么设置cookie得到cookie删除cookie
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一种情况,在某个用例流程中,由A页面跳至B页面,若在A页面中采用JS用变量temp保存了某一变量的值,在B页面的时候,同样需要使用JS来引用temp的变量值,对于JS中的全局变量或者静态变量的生命周期是有限的,当发生页面跳转或者页面关闭的时候,这些变量的值会重新载入,即没有达到保存的效果。解决这个问题的最好的方案是采用cookie来保存该变量的值,那么如何来设置和读取cookie呢? 首先需要稍微了解一下cookie的结构,简单地说:cookie是以键值对的形式保存的,即key=value的格式。各个cookie之间一般是以“;”分隔。
JS设置cookie:
假设在A页面中要保存变量username的值("jack")到cookie中,key值为name,则相应的JS代码为:
document.cookie="name="+username;
JS读取cookie:
假设cookie中存储的内容为:name=jack;password=123 则在B页面中获取变量username的值的JS代码如下:
var username=document.cookie.split(";")[0].split("=")[1];
//JS操作cookies方法!
写cookies
function setCookie(name,value) {
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
读取cookies
function getCookie(name) {
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
删除cookies
function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}
//使用示例
setCookie("name","hayden");
alert(getCookie("name"));
//如果需要设定自定义过期时间 //那么把上面的setCookie 函数换成下面两个函数就ok;
function setCookie(name,value,time) {
var strsec = getsec(time);
var exp = new Date();
exp.setTime(exp.getTime() + strsec*1);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
function getsec(str) {
alert(str);
var str1=str.substring(1,str.length)*1;
var str2=str.substring(0,1);
if (str2=="s") {
return str1*1000;
} else if (str2=="h") {
return str1*60*60*1000;
} else if (str2=="d") {
return str1*24*60*60*1000;
}
}
//这是有设定过期时间的使用示例: //s20是代表20秒 //h是指小时,如12小时则是:h12 //d是天数,30天则:d30
setCookie("name","hayden","s20");
如何用js来操作cookie呢?
js操作COOKIE,直接给document加上cookie就可以了,但是一般如果单个的加会很麻烦所以一般会直接写好一个函数,可以直接操作cookie,这样就很方便了
setCookie
这个是写入cookie,第一个是名称,第二个是cookie值,第三个是过期时间getCookie
这个是查找cookie;removeCookie
这是你需要删除的cookie;
function setCookie(name, value, iDay) {
var oDate = new Date();
oDate.setDate(oDate.getDate() + iDay);
document.cookie = name + '=' + encodeURIComponent(value) + ';expires=' + oDate;
}
function getCookie(name) {
var arr = document.cookie.split('; ');
var i = 0;
for(i = 0; i < arr.length; i++) {
//arr2-['username', 'abc']
var arr2 = arr[i].split('=');
if(arr2[0] == name) {
var getC = decodeURIComponent(arr2[1]);
return getC;
}
}
return '';
}
function removeCookie(name) {
setCookie(name, '1', -1);
}
JS里的POST方法如何设置cookie?
如果这段POST代码和提交的目标页面不在同一个域,脚本是没权限给它设置cookies的,这是浏览器的基本保护措施。 如果是同一个域,直接在本页面设置cookies就行了,无需给POST数据包中插入cookies.