【发布时间】:2016-10-30 04:16:01
【问题描述】:
我在向过滤器 (EssentialFilter) 中的会话添加数据时遇到问题。
在 scala api 中有方法 Result.withSession 和 Result.withNewSession 但在 java api 中没有。
如何使用新会话数据从过滤器返回结果?
试图这样做:
@Override
public EssentialAction apply(final EssentialAction next) {
return EssentialAction.of( request -> {
if (isAllowed(request)) {
Accumulator<ByteString, Result> accumulator = next.apply(request);
return accumulator.map(result -> {
Session session = result.session();
session.put("asdf", Long.toString(System.currentTimeMillis()));
return result;
}, executor);
} else {
return Accumulator.done(Results.unauthorized());
}
});
}
根据我在 debug/sources 中看到的情况,当结果返回 accumulator map 块时,结果已构建 ResponseHeader,并且会话的修改不会改变任何事情。
我尝试使用 asScala() 将结果转换为 scala 并提供新的会话项目 (withSession()),但我在将 java Session 转换为 scala/play Session 时遇到问题。也许有人可以指出如何正确地做到这一点?
Session session = result.session();
session.put("asdf", Long.toString(System.currentTimeMillis()));
play.api.mvc.Session newSession = ...?
return result.asScala().withSession(newSession).asJava();
[编辑]
我得到了这个工作:
scala.collection.immutable.Map<String, String> immutableMap = new scala.collection.immutable.HashMap<String,String>().empty();
for (Map.Entry<String, String> entry : session.entrySet()) {
immutableMap = immutableMap.$plus(new Tuple2<>(entry.getKey(), entry.getValue()));
}
play.api.mvc.Session newSession = new play.api.mvc.Session(immutableMap);
但是...如您所见,它真的很丑。没有其他更好的方法可以做到这一点吗?
【问题讨论】:
标签: java scala playframework-2.0