2014-02-14 37 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/