2014-02-14 36 views
2

我正在設計一個系統,用戶應該註冊一個特定的時間段然後註銷。他可以在一天內登錄和註銷多次。我必須計算所有這些會話來衡量表現。計數多次登錄和註銷會話

等什麼是設計數據庫,它

create table scheduler(
    ID bigint auto_increment, 
    userID varchar(100), 
    start_session TIMESTAMP, 
    end_session TIMESTAMP, 
    primary key(ID), 
    INDEX(userID) 
) 

我必須插入一個用戶的多個會話數據最好的方法。那麼我的理想任務是否合乎邏輯?還有一個信息將用於實時系統。

+0

好,但我沒有看到任何領域表現插入,並懷疑可以通過相同的運行代碼進行監視。我們得到了監視JVM的工具(我沒有使用它) –

回答

0

創建表可以說「登錄」有幾個字段,一個應該是:
entrie_id
用戶ID(其中bilongs到用戶actualy知道我們在談論哪個用戶)
日期(其中represend當天)
login_amount(每次用戶登錄時應該增加)默認值爲0.

使用此功能,您將有一天的靜態數據。

包括用戶登錄後更新數據庫。

例如,如果用戶使用ID 1登錄,並且今天是2014-02-14。

您必須在登錄表中搜索userID = 1和數據2014-02-14(今天是我們的情況),如果通過搜索這些數據而獲得錯誤,則使用今天的日期戳和用戶標識創建新的entrie ,否則更新logins_amount 1,所以如果它是第一次登錄,它應該做0 + 1,所以你總的登錄爲1.

編輯:顯然你可以在註銷腳本部分做同樣的事情。因爲你可能需要添加另一個字段logout_amount等

0

除非你使用websockets沒有辦法告訴用戶何時實際斷開連接,所以我看不到end_session是如何有意義的。如果你有所謂的「訪問」但是第三個表,即可以捕捉一個給定的會話下的所有HTTP請求:

CREATE TABLE user(
    id   BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    email   VARCHAR(255) NOT NULL, 
    password  VARCHAR(255) NOT NULL, 
    salt   VARCHAR(255) NOT NULL, 
    created  DATETIME NOT NULL 
); 

CREATE TABLE session(
    id  BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    user BIGINT NOT NULL, 
    created DATETIME NOT NULL 
    index(userid) 
); 

CREATE TABLE visit(
    id   BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    ip   VARCHAR(55) NOT NULL, 
    uri   VARCHAR(255) NOT NULL, 
    method  VARCHAR(20) NOT NULL, 
    userAgent  TEXT NOT NULL, 
    session  BIGINT NULL, 
    user   BIGINT NULL, 
    created  DATETIME NOT NULL 
    index(userid) 
); 

這將讓你捕獲有意義的數據。另外,如果您擔心特定會話在X分鐘後過期,請在驗證用戶會話時將X分鐘添加到創建的時間。或者當你正在尋找一個會話您可以在創建時的條件查詢:

SELECT 
    id, 
    user, 
    created 
FROM session 
WHERE created > {recent} 

凡近期將等於當前時間 - X分鐘。

爲了更好的安全性,我建議爲每個會話生成一個隨機標記,將用戶的cookie值設置爲用戶ID和會話標記的AES GCM加密,然後生成一個隨機鹽來散列會話標記,最後存儲哈希會話令牌+數據庫中的salt。如果您僅僅將會話的ID與cookie的值進行比較,我可以以任何用戶的身份向系統進行身份驗證......如果您使用隨機生成的令牌,則可以進行同樣的操作。在此基礎上

我修改會話表看起來更象這樣:

CREATE TABLE session(
    id  BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    user BIGINT NOT NULL, 
    token VARCHAR(255) NOT NULL, 
    salt VARCHAR(255) NOT NULL, 
    created DATETIME NOT NULL 
    index(userid) 
); 

最後,我注意到你在你的架構使用TIMESTAMP ...這是一般沒事的,只是要注意你只能存儲從1970年到2038年的日期。

如果你想看到的這個工作的例子,我有它在GitHub上的位置:https://github.com/kaeawc/play-encryption

這裏有一個工作演示:http://immense-garden-9877.herokuapp.com/