Quando si utilizza @before, viene utilizzato solo in una classe. Come applico un filtro globale in playframework? In questo modo viene utilizzato un filtro per tutte le classi di controller.Come applicare un filtro globale in playframework
risposta
Una soluzione semplice consiste nell'estendere un controller di base per tutti i controller e avere il @Before nel controller di base.
L'altra opzione (e la soluzione migliore, in quanto più flessibile) consiste nell'utilizzare l'annotazione @With. L'esempio sulla documentazione gioco è
Esempio:
public class Secure extends Controller {
@Before
static void checkAuthenticated() {
if(!session.containsKey("user")) {
unAuthorized();
}
}
}
E su un altro controller:
@With(Secure.class)
public class Admin extends Application {
...
}
Ciò significa il controller di amministrazione elaborerà tutti gli intercettori (@Before, @After, @ Infine) contenuto nel controller Secure.
Sfortunatamente questo richiede ancora di aggiungere l'annotazione '@ Con' a tutti i controller. Soprattutto nel caso del plug-in Sicuro, sarebbe preferibile rendere tutti i controllori sicuri per impostazione predefinita e quindi autorizzare quelli che dovrebbero essere accessibili pubblicamente. Non ho ancora capito come farlo. –
d'accordo, non mi piace la soluzione qui come ogni sviluppatore deve ricordare e il comportamento umano dice che sarà dimenticato a un certo punto. –
Per questo problema è sufficiente utilizzare PlayPlugin. Vedi here per maggiori dettagli.
cura di elaborare un po '? –
Scusate, ero di fretta l'ultima volta. Puoi trovare alcune informazioni qui: http://stackoverflow.com/questions/4515627/how-to-get-beforeactioninvocation-and-afteractioninvocation-to-be-called-in-play. Spero di trovare il tempo per creare una spiegazione più completa. – niels
ho fatto questa cosa molto gestendo le richieste in entrata a livello mondiale nella classe GlobalSettings:
questo descrive la classe: http://www.playframework.org/documentation/2.0/JavaGlobal
Questo descrive il metodo che ci si vuole ignorare. http://www.playframework.org/documentation/2.0/JavaInterceptors
Ecco un esempio di come l'ho usato nel mio progetto (ovviamente, questa è una versione semplificata di quello che stai cercando):
@Override
public play.mvc.Action onRequest(play.mvc.Http.Request request, java.lang.reflect.Method method) {
if (request.path().startsWith("/secret/locked")) {
return new Action.Simple() {
@Override
public Result call(play.mvc.Http.Context ctx) throws Throwable {
return redirect(routes.Application.forbidden());
}
};
}
return super.onRequest(request, method);
}
Non è una buona soluzione per estendere un controller di base per tutti i controller e avere @Before nel controller di base.
È possibile estendere il filtro o il filtro di essenza .e.g.
classe filtro1 estende Filtro {}
e applicare filtro1 a Global
Questo è legato alla mia domanda http://stackoverflow.com/questions/4597766/easy-way-to-use-secure- module-or-similar-on-all-controller-in-play. Ho provato a utilizzare un potenziatore bytecode per aggiungere un'annotazione '@ With' a tutti i controller, ma questo mi ha portato a questa domanda: http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance –
http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle