js設置cookie請求,JS設置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 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 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\nscriptconsole.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”)//傳入一個字符串數組,同時刪除多個cookieflow.removeCookie([“myCookie”,”uuer”,”newCookie”])   

如果你想查看從客戶端來的cookie,那麼直接看flow.cookie好了,它會在途中調用一個get_cookie的服務,將原始的字符始形式轉換為一個對象。

js怎麼設置cookie得到cookie刪除cookie

avaScript是運行在客戶端的腳本,因此一般是不能夠設置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;iarr.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.

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/304567.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Python載入Cookie錯誤解決方法用法介紹

    本文將從多個方面詳細闡述Python載入Cookie錯誤的解決方法,希望能對讀者有所幫助。 一、Cookie錯誤常見原因 1、Cookie過期:當Cookie過期時,載入Cooki…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • Cookie是後端生成的嗎?

    是的,Cookie通常是由後端生成並發送給客戶端的。下面從多個方面詳細闡述這個問題。 一、什麼是Cookie? 我們先來簡單地了解一下什麼是Cookie。Cookie是一種保存在客…

    編程 2025-04-28
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • JS圖片沿着SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿着SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27
  • 如何反混淆美團slider.js

    本文將從多個方面詳細闡述如何反混淆美團slider.js。在開始之前,需要明確的是,混淆是一種保護JavaScript代碼的方法,其目的是使代碼難以理解和修改。因此,在進行反混淆操…

    編程 2025-04-27
  • Python要學JS嗎?

    Python和JavaScript都是非常受歡迎的編程語言。然而,你可能會問,既然我已經學了Python,是不是也需要學一下JS呢?在本文中,我們將圍繞這個問題進行討論,並從多個角…

    編程 2025-04-27

發表回復

登錄後才能評論