2016-03-25 10 views
1

Ich benutze play 2.5.0. Ich kann Http.Context.current() im benutzerdefinierten Filter nicht abrufen. Wie ich es verstehe, liegt das daran, dass Filter in neuen Threads arbeiten. Ich brauche Http.Context, um zu überprüfen, ob der Benutzer in der Sitzung ist, bevor er mit seiner Anfrage arbeitet. EssentialFilter ermöglicht es uns, mit dem Executor aus dem Benutzer-Thread zu arbeiten. Vielleicht kann ich Kontext von Executor bekommen? Ich brauche Http.Context.current(). Session(). Oder eine Karte aller Sitzungen auf dem Server. Dann kann ich SESSION_KEY mit Daten in der Karte vergleichen.Http.Context in playframework Filter

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

Hat jemand irgendwelche Ideen? Vielen Dank.

Antwort

2

Filter sind fit für die Aufgaben, die jede Anforderung in jeder Route, wie das Zuziehen verarbeiten müssen: https://www.playframework.com/documentation/2.5.x/JavaHttpFilters

Die Aufgabe, die Sie häufig die Lösung beschreiben durch Aktion Zusammensetzungen (und Request-Handler)

Ein Beispiel für die Lösung: Intercept request and check authorization in playframework

aktualisieren

I Gibt es eine Möglichkeit, ctx (Http.Context) in Filtern zu verwenden?

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

Im Filter haben Sie Zugriff auf die RequestHeader. Request ist eine Subschnittstelle der RequestHeader, aber Context verwendet nicht die speziellen Methoden der Request. So können Sie Context auf Ihrem eigenen Formular die RequestHeader

bauen, oder besser, Sie können nur Informationen nehmen, die Sie von der RequestHeader benötigen.

auf dem Spiel Quellcode basiert, können Sie die Http.Session wie diese:

import scala.collection.JavaConversions; 

... 

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

Es ist ein ein wenig hacky aussieht, aber Sie können einen „dokumentiert Weg“ auch verwenden:

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

Aber dann müssen Sie den Weg finden, wie diese Cookies zu analysieren, weil sie wie c62d95d166b40c2cfcac88ae72c06e4bef12db5c-param1=111

+0

aussieht Vielen Dank für Ihre Antwort. Du hast recht. Für diese Aufgabe können wir Aktionszusammenstellungen verwenden. In diesem Fall können wir Benutzer ctx erhalten. Es funktioniert dasselbe zum Filtern. Es steht vor dem Start auf. Bei meiner Aufgabe ist es völlig ausreichend. Aber was ist mit Filtern? Sie geben uns die Fähigkeit, mit Anfrage und Antwort zu arbeiten. Gibt es eine Möglichkeit, ctx (Http.Context) in Filtern zu verwenden? Vielen Dank. –

+1

Schauen Sie sich das Update –

+0

Ich sehe es. Vielen Dank!!! Ich werde es versuchen. –