⑴ php。通過ajax設置cookie成功後,客戶端瀏覽器會更新cookie信息嗎就是說網頁不刷新
這樣是不會刷新的,你必須在通過ajax設置cookie後由後端返回設置結果(成功/失敗)
然後在前端通過js更新頁面
因為網頁在顯示時已經下載完畢,不會改變了,你需要改變網頁內容,就要用js修改,ajax取回來數據,然後前端用js根據數據來修改頁面
你的後端將cookie刪除了,但前端頁面已經被瀏覽器解析,所以瀏覽器不會自己修改登錄信息
解決方法:
ajax發送請求→PHP接到退出請求→PHP刪cookie→PHP返回成功碼{"success":1}或失敗碼{"success":0}→前端接受到返回碼→如果是1,則通過js將用戶名改掉(如document.getElementById('username').innerHTML='請登錄')等
一般退出是直接用一個鏈接,用戶訪問連接後,後端清理cookie,然後用302或301跳轉到原來頁面或首頁,目前大部分網站都是跳轉的方式退出的
雖然ajax不刷新頁面的方式理論上用戶體驗更好,但個人認為,退出賬戶這類操作不會經常使用,沒有必要用ajax,通常是網頁中動態展示的數據(如天氣、抽獎結果、活動參與信息)等經常需要變動的數據用ajax
⑵ 詳解PHP中cookie和session的區別及cookie和session用法小結
一、區別:
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能
考慮到減輕伺服器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中
二、用法小結:
1、cookie:
1)如何創建 cookie?
setcookie() 函數用於設置 cookie。setcookie(name, value, expire, path, domain); //setcookie("user", "Alex Porter", time()+3600);
注釋:setcookie() 函數必須位於 <html> 標簽之前。
2)如何取回 Cookie 的值?
$_COOKIE 變數用於取回 cookie 的值。
使用 isset() 函數來確認是否已設置了 cookie:
3)如何刪除 cookie?
當刪除 cookie 時,您應當使過期日期變更為過去的時間點。//setcookie("user", "", time()-3600);
2、session:
1)如何創建 session?
session_start() 函數啟動會話。
2)存儲 Session 變數
$_SESSION 變數賦值
isset() 函數檢測是否已設置
3)終結 Session
如果您希望刪除某些 session 數據,可以使用 unset() 或 session_destroy() 函數。注釋:session_destroy() 將重置 session,您將失去所有已存儲的 session 數據。
⑶ PHP中什麼是依賴注入
依賴注入可能是我所知道的最簡單設計模式之一,很多情況下可能你無意識中已經使用了依賴注入。不過它也是最難解釋的一個。我認為有一部分原因是由於大多數介紹依賴注入的例子缺乏實際意義,讓人難理解。因為PHP主要用於Web開發,那就先來看一個簡單的web開發實例。
HTTP本身是一個無狀態的連接協議,為了支持客戶在發起WEB請求時應用程序能存儲用戶信息,我們就需要通過一種技術來實現存儲狀態交互。理所當然最簡單的是使用cookie,更好的方式是PHP內置的Session機制。
$_SESSION['language'] = 'fr';
上面代碼將用戶語言存儲在了名為language的Session變數中,因此在該用戶隨後的請求中,可以通過全局數組$_SESSION來獲取language:
$user_language = $_SESSION['language'];
依賴注入主要用於面向對像開發,現在讓我們假設我們有一個SessionStorage類,該類封裝了PHP Session機制:
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
}
function set($key, $value)
{
$_SESSION[$key] = $value;
}
function get($key)
{
return $_SESSION[$key];
}
// ...
}
同時還有一個User類提供了更高級的封裝:
class User
{
protected $storage;
function __construct()
{
$this->storage = new SessionStorage();
}
function setLanguage($language)
{
$this->storage->set('language', $language);
}
function getLanguage()
{
return $this->storage->get('language');
}
// ...
}
代碼很簡單,同樣使用User類也很簡單:
$user = new User();
$user->setLanguage('fr');
$user_language = $user->getLanguage();
一切都很美好,除非你的程序需要更好的擴展性。假設現在你想要更改保存session_id的COOKIE鍵值,以下有一些可供選擇的方法:
User類中創建SessionStorage實例時,在SessionStorage構造方法中使用字元串』SESSION_ID』硬編碼:
class User
{
function __construct()
{
$this->storage = new SessionStorage('SESSION_ID');
}
// ...
}
在User類外部設置一個常量(名為STORAGE_SESSION_NAME)
class User
{
function __construct()
{
$this->storage = new SessionStorage(STORAGE_SESSION_NAME);
}
// ...
}
define('STORAGE_SESSION_NAME', 'SESSION_ID');
通過User類構造函數中的參數傳遞Session name
class User
{
function __construct($sessionName)
{
$this->storage = new SessionStorage($sessionName);
}
// ...
}
$user = new User('SESSION_ID');
還是通過User類構造函數中的參數傳遞Session name,不過這次參數採用數組的方式
class User
{
function __construct($storageOptions)
{
$this->storage = new SessionStorage($storageOptions['session_name']);
}
// ...
}
$user = new User(array('session_name' => 'SESSION_ID'));
上面的方式都很糟糕。
在user類中硬編碼設置session name的做法沒有真正解決問題,如果以後你還需要更改保存session_id的COOKIE鍵值,你不得不再一次修改user類(User類不應該關心COOKIE鍵值)。
使用常量的方式同樣很糟,造成User類依賴於一個常量設置。
通過User類構造函數的參數或數組來傳遞session name相對來說好一些,不過也不完美,這樣做干擾了User類構造函數的參數,因為如何存儲Session並不是User類需要關心的,User類不應該和它們扯上關聯。
另外,還有一個問題不太好解決:我們如何改變SessionStorage類。這種應用場景很多,比如你要用一個Session模擬類來做測試,或者你要將Session存儲在資料庫或者內存中。目前這種實現方式,在不改變User類的情況下,很難做到這點。
現在,讓我們來使用依賴注入。回憶一下,之前我們是在User類內部創建SessionStorage對像的,現在我們修改一下,讓SessionStorage對像通過User類的構造函數傳遞進去。
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
這就是依賴注入最經典的案例,沒有之一。現在使用User類有一些小小的改變,首先你需要創建SessionStorage對像。
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
現在,配置session存儲對像很簡單了,同樣如果改變session存儲對像也很簡單,所有這一切並不需要去更新User類,降低了業務類之間的耦合。
Pico Container 的網站上是這樣描述依賴注入:
依賴注入是通過類的構造函數、方法、或者直接寫入的方式,將所依賴的組件傳遞給類的方式。
所以依賴注入並不只限於通過構造函數注入。下面來看看幾種注入方式:
構造函數注入
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
}
setter方法注入
class User
{
function setSessionStorage($storage)
{
$this->storage = $storage;
}
// ...
}
屬性直接注入
class User
{
public $sessionStorage;
}
$user->sessionStorage = $storage;
根據經驗,一般通過構造函數注入的是強依賴關系的組件,setter方式用來注入可選的依賴組件。
現在,大多數流行的PHP框架都採用了依賴注入的模式實現業務組件間的高內聚低耦合。
// symfony: 構造函數注入的例子
$dispatcher = new sfEventDispatcher();
$storage = new sfMySQLSessionStorage(array('database' => 'session', 'db_table' => 'session'));
$user = new sfUser($dispatcher, $storage, array('default_culture' => 'en'));
// Zend Framework: setter方式注入的例子
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
'auth' => 'login',
'username' => 'foo',
'password' => 'bar',
'ssl' => 'ssl',
'port' => 465,
));
$mailer = new Zend_Mail();
$mailer->setDefaultTransport($transport);
⑷ php如何設置COOKIE控制登錄用戶的過期時間
在php函數裡面setcookie是有時間限制的
setcookie有3個參數
第一個參數是設置的變數名字
第二個參數是變數的值
第三個參數就是有效期了.有效期是以秒來計算的
假設你設置的cookie的有效期是1個小時,那麼從你設置的時間開始,到一個小時候這個cookie都有效.換句話說就是這個cookie變數能夠讀取到的時間是1個小時
一個小時之後這個變數就失效了.不存在了
用php控制用戶過期的話.先設置一個cookie.並設置時間長度.例如1天.每次當用戶訪問的時候都去讀取這個cookie.如果存在.就免驗證.如果不存在就重新驗證.這樣就實現了登陸用戶的過期時間問題.
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); /* 有效期1 小時 */
⑸ php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過簡單的說一下關於PHP防注入的方式吧。
對於現在的防注入技術其實已經成熟了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。