【发布时间】:2014-08-20 17:36:01
【问题描述】:
我正在开发一个基于 play framework 2 的原型,其中一个要求是过滤来自客户的重复发布请求。它是一个原型,并试图快速而肮脏地破解一个。我有以下数据结构和代码来跟踪重复项。
public class DuplicityService {
private static ConcurrentHashMap<String,List<String>> keyIps = new ConcurrentHashMap<String,List<String>>();
public static boolean isDuplicate(String key,String ip){
List<String> value = keyIps.get(key);
return value != null && value.contains(ip);
}
public static void remove(String key){
keyIps.remove(key);
}
public static void add(String key,String ip){
List<String> value = keyIps.get(key);
if(value == null){
value = new ArrayList<String>();
}
value.add(ip);
keyIps.put(key, value);
}
}
我在我的控制器中使用它
def submitResponse(qkey:String) = CorsAction(parse.json){
req =>
val json = req.body
val key = json.\("Key").as[String]
....
if(DuplicityService.isDuplicate(key,req.remoteAddress)){
...
BadRequest("Duplicate Response " + key)
}
else{
...
DuplicityService.add(key,req.remoteAddress)
Ok(json)
...
}
}
并在单独的控制器方法中从并发哈希图中删除键
def publish(key: String) = Authenticated{
...
DuplicityService.remove(key)
...
}
现在的问题是,虽然在我的本地机器上手动测试它工作正常。我能够正确识别来自同一 IP 地址的重复发布请求。
但是,在 heroku 上,这不起作用。我能够从同一客户发出重复的发布请求。
我有一个 Heroku play 2 服务器的基本实例。
任何指点或帮助将不胜感激。
PS:不使用数据库,有没有更好的方法来做我正在尝试的事情。
谢谢
【问题讨论】:
标签: scala heroku concurrency concurrenthashmap playframework-2.3