2011-01-07 26 views
10

Al usar @before, solo se usa en una clase. ¿Cómo aplico un filtro global en playframework? Entonces ese filtro se usa para todas las clases de controlador.Cómo aplicar un filtro global en playframework

+0

Esto se relaciona con mi pregunta http://stackoverflow.com/questions/4597766/easy-way-to-use-secure- module-or-similar-on-all-controllers-in-play. Traté de usar un mejorador de bytecode para agregar una anotación '@ With' a todos los controladores, pero eso me llevó a esta pregunta: http://stackoverflow.com/questions/4608883/problem-with-classes-not-found-during -playplugin-enhance –

+0

http://www.playframework.com/documentation/2.1.0/ScalaInterceptors – ThePizzle

Respuesta

6

Una solución simple es extender un controlador base para todos sus controladores y tener el @Before en el controlador base.

La otra opción (y la mejor solución, ya que es más flexible) es usar la anotación @With. El ejemplo de la documentación juego es

Ejemplo:

public class Secure extends Controller { 

    @Before 
    static void checkAuthenticated() { 
     if(!session.containsKey("user")) { 
      unAuthorized(); 
     } 
    } 
}  

Y en otro controlador:

@With(Secure.class) 
public class Admin extends Application { 

    ... 

} 

Esto significa que el controlador de administración procesará todos los interceptores (@Before, @After, @ Finalmente) contenido dentro del controlador seguro.

+2

Desafortunadamente, esto todavía requiere que agregue la anotación '@ With' a todos los controladores. Particularmente en el caso del plugin Secure, sería preferible poder asegurar todos los controladores de forma predeterminada y luego incluir en la lista blanca aquellos que deberían ser de acceso público. Aunque no he descubierto cómo hacerlo. –

+0

de acuerdo, no me gusta la solución aquí, ya que todo desarrollador debe recordar y el comportamiento humano dice que será olvidado en algún momento. –

1

Simplemente puede usar PlayPlugin para este problema. Vea here para más detalles.

+0

cuidado para elaborar un poco? –

+0

Lo siento, tuve prisa la última vez. Puede encontrar información aquí: http://stackoverflow.com/questions/4515627/how-to-get-beforeactioninvocation-and-afteractioninvocation-to-belement-in-play. Espero que encuentre tiempo para crear una explicación más completa. – niels

2

me hicieron esto mismo por el manejo de peticiones de entrada a nivel mundial en la clase GlobalSettings:

Esto describe la clase: http://www.playframework.org/documentation/2.0/JavaGlobal

Esto describe el método que le desea anular. http://www.playframework.org/documentation/2.0/JavaInterceptors

Aquí hay un ejemplo de como lo he usado en mi propio proyecto (por supuesto, esta es una versión simplificada de lo que estás buscando):

@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); 
} 
+0

¿Tiene un ejemplo de código para Play 2.1/scala? – ripper234

+1

@ ripper234 http: //www.playframework.com/Documentación/2.1.0/ScalaInterceptors – ThePizzle

0

No es una buena solución para extender un controlador base para todos sus controladores y tiene el @Before en el controlador base.

Puede ampliar el filtro o el filtro essensial .e.g.

filtro1 clase extiende filtro {}

y aplicar filtro1 a Global

Cuestiones relacionadas