关于您的第一个问题,通常建议在单个事务中进行检查并插入。这取决于您使用的数据库,但这些通常称为UPSERT
语句。在 PLSQL 中,它看起来有点像这样(根据口味修改):
CREATE FUNCTION upsert_user(emailv character varying, saltv character varying, hashv character varying, date_createdv timestamp without time zone) RETURNS void
LANGUAGE plpgsql
AS $$;
BEGIN
LOOP
-- first try to update the key
UPDATE users SET (salt, hash) = (saltv, hashv) WHERE email = emailv;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO users(email, salt, hash, date_created) VALUES (emailv, saltv, hashv, date_createdv);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END;
$$;
关于您的第二个问题,通常 Secure
通过 HTTPS 的 cookie 就足够了。我会设置HttpOnly
选项,通常也会设置选项Path
。
HttpOnly
表示 cookie 不能被 JS 访问(只有 HTTP 或 HTTPS),并且该Path
选项允许您指定 cookie 有效的路径(在 URL 中)。