2017-07-25 59 views
1

我對Chris Kacerguis的CodeIgniter REST服務器有一個相當奇怪的問題。即使未加載codeigniter會話庫,也會在數據庫中創建新的會話條目。爲什麼?

問題:

1)我不加載笨會話庫,即使在當時都在ci_sessions數據庫表中創建新條目,每次我提出一個HTTP請求到我的REST API。

2)即使在IP地址保持不變的情況下,每個HTTP請求中的數據庫中都會創建一個全新條目(並且舊條目不會更新)。

這是我的config.php文件:

$config['sess_driver'] = 'database'; 
$config['sess_cookie_name'] = 'ci_session'; 
$config['sess_expiration'] = 0; 
$config['sess_save_path'] = 'ci_sessions'; 
$config['sess_match_ip'] = TRUE; 
$config['sess_time_to_update'] = 300; 
$config['sess_regenerate_destroy'] = TRUE; 

$config['cookie_prefix'] = ''; 
$config['cookie_domain'] = ''; 
$config['cookie_path']  = '/'; 
$config['cookie_secure'] = FALSE; 
$config['cookie_httponly'] = FALSE; 

我試過了,單獨和組合,下面的事情:

$config['sess_match_ip'] = FALSE; 
$config['sess_time_to_update'] = 0; 
$config['sess_regenerate_destroy'] = FALSE; 

$config['cookie_domain'] = '.mydomain.com'; 

但毫無效果。

這是正常還是某種錯誤?我究竟做錯了什麼?其他人還有相同的疑問麼?

另一件事是,我沒有在香草CodeIgniter中面臨這個問題。在那裏,一切工作正常,如預期。

更新

我發現的東西,而這個問題的第二部分中掙扎。

在創建第一個HTTP請求時,數據庫中正在創建兩個會話條目 - 一個用於客戶端,另一個用於REST服務器。從第二個請求中,cookie的客戶端'版本'正在更新,而服務器'版本'正在重新生成。

+0

檢查自動加載? –

+0

已經選中並重複檢查。會話不在那裏。 – Raja

+0

無論您正在使用哪種庫來執行REST API,都可能正在使用會話。 –

回答

2

有關問題的第1部分:

正如@JamesLalor在評論中指出,

  1. 您必須是自動加載會話

    OR

  2. 你是使用一些外部庫,然後加載會話庫。

對於問題的第二部分:

以下解決方案可能不是最好的,但它爲我工作。

  1. 你有相同的CodeIgniter應用程序目錄中同時REST服務器和客戶端

  2. 會議庫自動:當發生

    多個會話創建問題 - 已加載

對於客戶來說,用戶就是消費者。會話爲用戶創建,具有該用戶的IP地址。在用戶的瀏覽器上設置一個cookie,根據驗證結果驗證和更新會話(或新創建)。

對於REST服務器,客戶端是用戶。這裏還創建了一個會話(如果滿足上述條件1和2),但是這次是爲客戶端創建的,並且此會話具有客戶端所在的服務器的IP地址(如果滿足上述條件1 ,那麼它就是您的應用所在的同一臺服務器的IP地址)。但是這次不能設置cookie,因爲消費者不是瀏覽器。因此,會話驗證失敗,並且每次加載頁面時都會創建一個新會話。

解決方案:

REST是無狀態的,每個請求應包含所有完成請求所需的信息。因此,在REST服務器上使用會話(其唯一工作是維護用戶的狀態)被認爲是不好的做法。客戶端的工作是維護用戶的會話並在每個請求上將所需信息傳遞給REST服務器。

因此,假設你會不會需要REST服務器內的會話,解決的辦法是autoload[‘libraries’]列表中刪除sessionautoload.php文件中,並加載客戶端的構造函數中的庫(或當你需要它)

對不起語法錯誤和/或英語不好。這不是我的母語。

相關問題