我使用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);
});
}
有人有什么想法吗?感谢。
答案 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
您可以访问RequestHeader
。 Request
是RequestHeader
的子接口,但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