cookie運作原理是吧伺服器端的資料儲存於user端的瀏覽器中,然後可讀寫cookie值,通常用於網站登入儲存會員密碼之類的,但也能作為區隔同ip多台電腦或同電腦多個不同瀏覽器的識別,只需要在網站首次進入時寫入一組cookieid即可。
不過問題來了,php雖然可以使用setcookie()寫入cookie,但卻無法判斷user端的cookie是否啟用(cookie是在瀏覽器前端執行),用js也能寫入cookie並判斷是否啟用,但所需的參數還是需要php先輸出到樣板在用js取值寫入,怎麼用都很麻煩的感覺。
解決方案就是用js來判斷user端的cookie是否啟用,若啟用直接用ajax在php端setcookie()寫入cookie,這樣整合起就能吧js跟php不足的地方都補齊了,方便好用。
以下為code範例
//tpl樣板部分
<!-- 載入cookie -->
<script type="text/javascript" src="<{$xoops_url}>/modules/模組ID/js/cookie.js"></script>
<script>var xoopsjsurl='<{$xoops_url}>';</script>
//js部分
//建立一個cookie.js檔並放置以下內容
不過問題來了,php雖然可以使用setcookie()寫入cookie,但卻無法判斷user端的cookie是否啟用(cookie是在瀏覽器前端執行),用js也能寫入cookie並判斷是否啟用,但所需的參數還是需要php先輸出到樣板在用js取值寫入,怎麼用都很麻煩的感覺。
解決方案就是用js來判斷user端的cookie是否啟用,若啟用直接用ajax在php端setcookie()寫入cookie,這樣整合起就能吧js跟php不足的地方都補齊了,方便好用。
以下為code範例
//tpl樣板部分
<!-- 載入cookie -->
<script type="text/javascript" src="<{$xoops_url}>/modules/模組ID/js/cookie.js"></script>
<script>var xoopsjsurl='<{$xoops_url}>';</script>
//js部分
//建立一個cookie.js檔並放置以下內容
//判斷cookie是否啟用並寫入cookieid
//AJAX-php部分
include_once "header.php"; //引入header.php
//參數
$httponly= XOOPS_PROT=='http://' ? false : true; // 判斷網站是否為ssl
$days="5"; //cookie失效天數
define("_MS_COOKIE_TEXT","瀏覽器cookie正在寫入中請稍後!!"); //說明
//建立cookieid
if(empty($_COOKIE['cookieid'])){ //如果cookieid不存在才寫入
$backvar=setcookie("cookieid", "cid_".strtotime(date("Y-m-d H:i:s"))."_".rand(0,999), strtotime( '+'.$days.' days' ), "/", XOOPS_COOKIE_DOMAIN, $httponly);
$box="<div style='font-size: 150%' class='text-center alert alert-info' role='alert'><span class='glyphicon glyphicon-exclamation-sign' aria-hidden='true'></span> "._MS_COOKIE_TEXT."</div>";
}
echo $backvar.','.$box;
這樣如果user端沒啟用cookie,則程式不會寫入cookieid,若user有啟用cookie,則寫入cookieid,更新頁面後除非cookieid失效否則不會執行寫入程式。
$(document).ready(function() {
if (typeof(getCookieByName('cookieid')) != 'undefined') return //判斷指定cookie是否有建立,空值才執行以下程式
var dt = new Date();
dt.setSeconds(dt.getSeconds() + 60);
document.cookie = "cookietest=1; expires=" + dt.toGMTString(); //建立一個測試cookie
var cookiesEnabled = document.cookie.indexOf("cookietest=") != -1; //判斷測試cookie是否存在
//判斷cookies啟用寫入指定cookie
if(cookiesEnabled) {
$.ajax({
url: xoopsjsurl + '/modules/neillibrary/ajax.php',
type: 'POST',
success: function(response) {
var $response_arr = response.split(','); //切割陣列
if ($response_arr['0'] == true && typeof(getCookieByName('cookieid')) != 'undefined') {
$("body").html($response_arr['1']);
window.location.replace(location.href);
}
},
error: function() {
console.log('ajax error!');
}
})
}
//讀取解析cookie
function parseCookie() {
var cookieObj = {};
var cookieAry = document.cookie.split(';');
var cookie;
for (var i = 0, l = cookieAry.length; i < l; ++i) {
cookie = jQuery.trim(cookieAry[i]);
cookie = cookie.split('=');
cookieObj[cookie[0]] = cookie[1];
}
return cookieObj;
}
function getCookieByName(name) {
var value = parseCookie()[name];
if (value) {
value = decodeURIComponent(value);
}
return value;
}
});
//AJAX-php部分
include_once "header.php"; //引入header.php
//參數
$httponly= XOOPS_PROT=='http://' ? false : true; // 判斷網站是否為ssl
$days="5"; //cookie失效天數
define("_MS_COOKIE_TEXT","瀏覽器cookie正在寫入中請稍後!!"); //說明
//建立cookieid
if(empty($_COOKIE['cookieid'])){ //如果cookieid不存在才寫入
$backvar=setcookie("cookieid", "cid_".strtotime(date("Y-m-d H:i:s"))."_".rand(0,999), strtotime( '+'.$days.' days' ), "/", XOOPS_COOKIE_DOMAIN, $httponly);
$box="<div style='font-size: 150%' class='text-center alert alert-info' role='alert'><span class='glyphicon glyphicon-exclamation-sign' aria-hidden='true'></span> "._MS_COOKIE_TEXT."</div>";
}
echo $backvar.','.$box;
這樣如果user端沒啟用cookie,則程式不會寫入cookieid,若user有啟用cookie,則寫入cookieid,更新頁面後除非cookieid失效否則不會執行寫入程式。
以上工作心得撰寫,有需要的朋友參考看看!
工作心得撰寫:徐嘉裕 Neil hsu
留言
張貼留言