playframework中的Http.Context过滤

时间:2016-03-25 11:24:11

标签: session filter playframework

我使用play 2.5.0。我无法在自定义过滤器中获取Http.Context.current()。据我所知,这是因为过滤器在新线程中工作。在使用他的请求之前,我需要Http.Context来检查用户是否在会话中。 EssentialFilter允许我们从用户线程使用Executor。也许我可以从执行者那里得到上下文?我需要Http.Context.current()。session()。或者服务器上所有会话的地图。我可以将SESSION_KEY与地图中的数据进行比较。

private final Executor executor;
@Inject
public SessionFilter(Executor executor) {
    super();
    this.executor = executor;
}

@Override
public EssentialAction apply(EssentialAction next) {
    Http.Context ctx = getHttpContext(executor);
    //Need to get ctx from executor
    checkIfUserInSession(ctx);
    return EssentialAction.of(request -> {
        Accumulator<ByteString, Result> accumulator = next.apply(request);
        return accumulator.map(result -> {
            return result;
        }, executor);
    });
}

有人有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

过滤器适合需要处理每个路径中的每个请求的任务,例如压缩:https://www.playframework.com/documentation/2.5.x/JavaHttpFilters

您描述的任务通常由操作组合(和请求处理程序)解析

解决方案的示例:Intercept request and check authorization in playframework

<强>更新

  

有没有办法在过滤器中使用ctx(Http.Context)?

是。 Http.Context is building from the request

    public Context(Request request) {
        this.request = request;
        this.header = request._underlyingHeader();
        this.id = header.id();
        this.response = new Response();
        this.session = new Session(JavaConversions.mapAsJavaMap(header.session().data()));
        this.flash = new Flash(JavaConversions.mapAsJavaMap(header.flash().data()));
        this.args = new HashMap<String,Object>();
        this.args.putAll(JavaConversions.mapAsJavaMap(header.tags()));
    }

Filter您可以访问RequestHeaderRequestRequestHeader的子接口,但Context不使用Request的特殊方法。因此,您可以在自己的表单Context

上构建RequestHeader

或者更好的是,您可以从RequestHeader获取所需的信息。

根据播放源代码,您可以获得Http.Session这样的内容:

import scala.collection.JavaConversions;

... 

Http.Session session = new Http.Session(JavaConversions.mapAsJavaMap(requestHeader._underlyingHeader().session().data()));

看起来有点像hacky,但你可以使用&#34;记录的方式&#34;以及:

requestHeader.cookies().get("PLAY_SESSION").value()

但是,您需要找到解析Cookie的方法,因为它们看起来像c62d95d166b40c2cfcac88ae72c06e4bef12db5c-param1=111