2016-03-25 15 views
1

私はプレイ2.5.0を使用します。カスタムフィルタでHttp.Context.current()を取得できません。私が理解しているように、これはフィルタが新しいスレッドで動作するためです。彼のリクエストを処理する前に、ユーザーがセッション中であるかどうかを確認するために、Http.Contextが必要です。 EssentialFilterを使用すると、ユーザースレッドからExecutorを操作できます。私はエグゼクティブから文脈を得ることができますか? Http.Context.current()。session()が必要です。またはサーバー上のすべてのセッションのマップ。私はSESSION_KEYとmapのデータを比較できます。Http.Context in playframework filters

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); 
    }); 
} 

他にもアイデアはありますか?ありがとう。

答えて

2

フィルタがビュンと同様に、すべてのルートにすべての要求を処理する必要のあるタスクにフィットさ:https://www.playframework.com/documentation/2.5.x/JavaHttpFilters

あなたは、一般的にアクション組成物(および要求ハンドラ)によって解決を説明タスク

の例解決策:Intercept request and check authorization in playframework

更新

Iそこにフィルタでctx(Http.Context)を使用するいくつかの方法はありますか?

はい。 Http.Context is building from the request。あなたはRequestHeaderへのアクセス権を持ってFilter

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())); 
    } 

RequestRequestHeaderのサブインターフェイスですが、ContextRequestの特別な方法を使用しません。だから、あなたはあなた自身のフォームRequestHeader

またはそれ以上にContextを構築することができ、あなたはちょうどあなたがRequestHeaderから必要な情報を取ることができます。遊びのソースコードに基づいて

、あなたはこのようなHttp.Sessionを取得することができます:

import scala.collection.JavaConversions; 

... 

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

それは少しハックに見えるのですが、あなたにも、「文書化の道を」使用することができます。

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

しかし、そのように見えるので、そのクッキーを解析する方法を見つける必要がありますc62d95d166b40c2cfcac88ae72c06e4bef12db5c-param1=111

+0

あなたの答えをありがとう。あなたが正しいです。この作業のために、アクション作曲を使用することができます。この場合、ユーザーctxを取得できます。それはフィルタリングするのと同じように動作します。ルートが始まる前に起きます。私の仕事では、それだけで十分です。しかし、フィルターはどうですか?彼らは私たちに要求と応答で作業する能力を与えます。フィルタにctx(Http.Context)を使用する方法はありますか?ありがとうございました。 –

+1

更新を見てください –

+0

私はそれを参照してください。どうもありがとうございました!!!試してみます。 –