У меня возникают проблемы с добавлением данных в сеанс в фильтре (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());
}
});
}
Из того, что я вижу в отладочных/источниках, в результате времени возвращается в картах блоке аккумулятора, результат устроится ResponseHeader и модификация сессии не измените вещь.
Я попытался преобразовать результат в scala с помощью asScala()
и предоставить новые элементы сеанса (withSession()
), но у меня возникают проблемы с преобразованием java-сессии в 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);
но ... как вы можете видеть, что это действительно некрасиво. Разве нет другого, более привлекательного способа сделать это?