Как применить глобальный фильтр в playframework

При использовании метода @перед этим он используется только в одном классе. Как применить глобальный фильтр в playframework? Так что один фильтр используется для всех классов контроллеров.

Ответ 1

Простое решение состоит в том, чтобы расширить базовый контроллер для всех ваших контроллеров и иметь @Before в базовом контроллере.

Другой вариант (и лучшее решение, поскольку оно более гибкое) заключается в использовании аннотации @With. Пример в документации для воспроизведения:

Пример:

public class Secure extends Controller {

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

И на другом контроллере:

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

    ...

}

Это означает, что контроллер администратора будет обрабатывать все перехватчики (@Before, @After, @Finally), содержащиеся в контроллере Secure.

Ответ 2

Я сделал именно это, обработав входящие запросы глобально в классе GlobalSettings:

Это описывает класс: http://www.playframework.org/documentation/2.0/JavaGlobal

Здесь описывается метод, который вы хотите переопределить. http://www.playframework.org/documentation/2.0/JavaInterceptors

Вот пример того, как я использовал его в своем собственном проекте (конечно, это упрощенная версия того, что вы ищете):

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

Ответ 3

Вы можете просто использовать PlayPlugin для этой проблемы. Подробнее см. здесь.

Ответ 4

Это нехорошее решение для расширения базового контроллера для всех ваших контроллеров и имеет @Before в базовом контроллере.

Вы можете расширять фильтр или фильтр essensialfeter.e.g.

class filter1 extends Filter {}

и примените filter1 к Global