2012-04-12 11 views
2

私は 'loginStatus'フィールドを持つテーブルを持っています。ユーザーがログインするたびに、値は1に設定され、ログアウトをクリックすると値は0に設定されます。ユーザーがログインしようとすると、そのフィールドの値がチェックされます。ログインします.1の場合、ユーザーはログインできません。いまのところブラウザが閉じていると、そのユーザーIDでログインすることはできません。そのフィールドの値はまだ1です(彼はログアウトボタンをクリックしていないので、変更されません)。ユーザーがブラウザを閉じない限り、私のアプリケーションは正常に動作しています。ブラウザでのシングルユーザマルチログインの防止

私はこの問題が異なる方法で解決できることは知っていますが、私はこのようにするよう求められています。今問題は、Java EEのそれほどプロではないので、説明を含む複数のヘルプは、私が探しているものです。

また、次のような解決策があります。データベースログインを作成してloginStatusの値を0に変更します。これは、ユーザーがログインすると15分後にトリガーされます。作成方法もわかりません。特定の時間の後にトリガーする種類のトリガー。

答えて

1

定期的に実行され、古いセッションが期限切れのデータベースジョブを作成できます。使用しているOracleのバージョンに応じて、DBMS_JOBパッケージまたはより洗練されたDBMS_SCHEDULERパッケージを使用できます。 DBMS_JOBは古いパッケージですが、このような比較的単純で独立したタスクでは、学習曲線が少なくなります。あなたは、実行時にロックを解除するア​​カウントおよびそれらのロックを解除するかを決定、あなたがその手順はもちろん、15分ごとに

DECLARE 
    l_jobno INTEGER; 
BEGIN 
    dbms_job.submit(l_jobno, 
        'BEGIN unlock_accounts; END;', 
        sysdate + interval '15' minute, 
        'sysdate + interval ''15'' minute'); 
    commit; 
END; 

を実行させるDBMS_JOBを使用することができ、ストアドプロシージャUNLOCK_ACCOUNTSを持っている場合たとえば、あなたはまた、使用することができますJavaスケジューラ(Quartzが一般的です)または同じことを行うDBMS_SCHEDULERパッケージ。しかし、ログインタイムスタンプを格納するフィールドがあるので、UNLOCK_ACCOUNTSプロシージャは15分以上前にどのログインが行われたかを把握できる必要があります。

しかし、一般的に、このアーキテクチャ全体はむしろ疑わしいものです。ユーザーが以前の時点で別のブラウザを開いたため、Webベースのアプリケーション(本質的にステートレス)がログインを拒否したいと思うのはかなり奇妙です。彼らがセキュリティ問題としてしばしば活動していない場合、セッションをタイムアウトさせるのは比較的一般的ですが、15分は一般にそのような方法では短すぎます。銀行ウェブサイトでさえも、それより長くアイドルになることがあります。また、この方法では、ログインが15分以上離れている限り、複数のブラウザ/コンピュータから同時にログインすることはできません。

2

この要件が満たされていれば、ジョブを実行することなくアカウントを自動的に期限切れにすることができます。

単純な「オン/オフ」フラグの代わりに、現在の日付/時刻に設定されているテーブルに日付/タイムスタンプを付けます。毎回、ユーザーがリクエストでサーバーにヒットしたときに、この列を現在の時刻に更新します。

2番目のセッションがログインしようとすると、そのセッションはテーブルの日付/タイムスタンプをチェックし、15分以上経過していればログインが許可されます。それ以外の場合はブロックされます。

関連する問題