あなたがセッション制御を持っていない場合は、アカウント内の符号は、Bはまた、Bは、情報の変更が表示されます、アカウントが同じアカウントで改訂された情報を記録し、この場合、Webアプリケーションに表示されるので、ユーザー体験がします悪い、Bは、情報が変更されますなぜ私は、ああ変更されていないと感じます。そして、セッション制御、まずログインを行った後、その後、その後、Bは、組立ラインオフスクイズログインし、Bをログに記録します。
アイデアの実現:タイムスタンプ比較
1まず、背景は、ブロッキングを行うために必要とされていない、でユーザーログが、フロントデスクのユーザー名とパスワードを背景に合格し、背景が前面にJWT形式のトークンを生成し、キー、ユーザー情報などのトークンとのRedisに値を保存します
2その他のURLパスは、フィルタは、フロントデスクに直接エラーメッセージを返します彼らは、フロントデスクのトークンを運ぶかどうかを判断する、またはトークンを運ぶために、要求をインターセプトしますが、(見つけるにRedisの)無効になっている、この時間は、ユーザ名となりますだけでなく、キー名へのユーザーのためのキー、トークンからのRedisのクエリ、Redisのにトークンとして値。要求を解放し、もしトークンRedisのクエリとフロントデスクから渡す、解放要求を同じトークンを来て、トークンのRedisからの問合せの場合フロントデスクから来る渡すことは同じトークンでないと、あなたはタイムスタンプのフロントデスクからトークンを渡した場合のRedisよりも大きい、Redisのは、トークンがキャンセルトークンを拒否されたカバー、他のデバイスでは、すでに自分のログインアカウントに戻って、リクエストをインターセプト。
パブリック クラスCompareKickOutFilterはKickOutFilter {延び @Override パブリック(HttpServletRequestのリクエスト、HttpServletResponseの応答){isAccessAllowedのブール 文字列トークン = request.getHeader(" 認可" )。 文字列名 = JWTUtil.getUsername(トークン)。 文字列USERKEY = PREFIX + ユーザ名。 RBucketの<string>バケット= redissonClient.getBucket(USERKEY)。 文字列redisToken =バケット。取得(); もし(StringUtils.isBlank(redisToken)){ // 第一次设置 。バケットSET (トークン); } そう IF(token.equals(redisToken)){ // 同じトークン リターン trueに; } 他{ ロングredisTokenUnixTime = JWTUtil.getClaim(redisToken、" CREATETIME " ).asLong(); ロングtokenUnixTime JWTUtil.getClaim =(トークン、" CREATETIME " ).asLong(); IF(tokenUnixTime.compareTo(redisTokenUnixTime)> 0 ){ // 渡されたが、今から最新のトークンである、古いトークンを上書き バケット。SET (トークン); } 他{ // 現在のトークンログオフ userService.logout(トークン); sendJsonResponse(レスポンス、4001、" あなたのアカウントは、他の機器に登録されている" ); を返す 偽; } } 戻り値 をtrueにし; } }
プロジェクト構造:
プロジェクト住所:https://github.com/jake1263/loginCtl