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

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


person Lion    schedule 07.01.2011    source источник
comment
Это связано с моим вопросом stackoverflow.com/questions/4597766/ . Я попытался использовать усилитель байт-кода, чтобы добавить аннотацию @With ко всем контроллерам, но это привело меня к следующему вопросу: stackoverflow.com/questions/4608883/   -  person Brad Mace    schedule 08.01.2011
comment
playframework.com/documentation/2.1.0/ScalaInterceptors   -  person ThePizzle    schedule 06.03.2013


Ответы (4)


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

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

Пример:

public class Secure extends Controller {

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

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

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

    ...

}

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

person Codemwnci    schedule 07.01.2011
comment
К сожалению, это по-прежнему требует добавления аннотации @With ко всем контроллерам. В частности, в случае плагина Secure было бы предпочтительнее иметь возможность сделать все контроллеры безопасными по умолчанию, а затем внести в белый список те, которые должны быть общедоступными. Хотя я еще не придумал, как это сделать. - person Brad Mace; 08.01.2011
comment
согласен, мне не нравится решение здесь, поскольку каждый разработчик должен помнить, и человеческое поведение говорит, что в какой-то момент оно будет забыто. - person Dean Hiller; 17.02.2012

Я сделал именно это, обрабатывая входящие запросы глобально в классе 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);
}
person Christopher Davies    schedule 08.09.2012

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

person niels    schedule 10.01.2011
comment
Извините, что в прошлый раз торопился. Вы можете найти некоторую информацию здесь: stackoverflow.com/questions/4515627/. Надеюсь, что я найду время, чтобы создать более полное объяснение. - person niels; 15.01.2011

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

Вы можете расширить фильтр или основной фильтр, например.

класс filter1 расширяет фильтр {}

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

person user3231931    schedule 25.07.2014