1 つの戦略は、関連するデータを DB に格納し、キャッシュ ライブラリを使用してすべてのユーザーを追跡することexpiry date-time
です (有効期限をチェックしながら DB ヒットを減らすため)。以下に小さな例を示します。
ユーザー ID を有効期限にマップする列を持つ DB テーブルを作成します: id, unique_user_id, expiry_date_time
。この ID を持つユーザーに URL を送信する前に、コードで一意のユーザー ID を作成し、DB に保存する必要があります。null
の初期値として保持できますexpiry_date_time
。Java でこのマッピングを表すクラスを作成します。
class UserIdWithExpiryDate{
private String userId;
private Date expiryDateTime;
...
}
指定されたに対して this のインスタンスを返すメソッドで を定義しService
ます。cacheable
userId
public interface CacheableService {
@Cacheable("expiryDates")
public UserIdWithExpiryDate getUserIdWithExpiryDate(String id);
public void updateUserIdWithExpiryDate(String userId);
}
import org.joda.time.DateTime;
@Service
public class CacheableServiceImpl implements CacheableService {
@Autowired
private YourDao dao;
@Override
public UserIdWithExpiryDate getUserIdWithExpiryDate(String id) {
return dao.getUserIdWithExpiryDate(id);
}
public void updateUserIdWithExpiryDate(String userId){
Date expiryDate = new Date(new DateTime().plusHours(24).getMillis());
dao.update(userId, expiryDate);
}
}
メソッドの結果はgetUserIdWithExpiryDate
キャッシュに格納されるため、後続の呼び出し (同じ引数を使用) では、メソッドを実際に実行しなくてもキャッシュ内の値が返されます。
次のステップは、サイトへのアクセス中にユーザーの有効期限を確認することです。これは、OncePerRequestFilterを使用して実行できます。
@Component("timeoutFilter")
public class TimeoutFilter extends OncePerRequestFilter {
@Autowired
CacheableService cacheableService;
// Here you need to decide whether to proceed with the request or not
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(request, response);
}
}
doFilterInternal
ユーザーの有効性を確認するためにメソッド内で実行できる手順は次のとおりです。
- リクエストからユーザー ID を取得する
- 実行する:
cacheableService.getUserIdWithExpiryDate(userId)
- ステップ 2 で null が返された場合、この ID を持つユーザーは存在しません。リクエストを続行しないでください。
- ステップ 2 で UserIdWithExpiryDate のインスタンスが返された場合は、「expiryDateTime」の値を確認します。
- 「expiryDateTime」の値が null の場合、ユーザーが初めてサイトにアクセスしていることを意味します。「userExpiryDate」:cacheableService.updateUserIdWithExpiryDate(userId) を更新し、リクエストを続行します。
- 「expiryDateTime」が null でない場合は、これを現在の date_time と比較します。の場合
expiryDateTime.isAfter(currentDateTime)
は、リクエストを続行します。
キャッシングには、EHCACHEでSpring Cache Abstractionを使用できます。