При использовании @before он используется только в одном классе. Как применить глобальный фильтр в playframework? Так что один фильтр используется для всех классов контроллеров.
Как применить глобальный фильтр в playframework
Ответы (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.
@With
ко всем контроллерам. В частности, в случае плагина Secure было бы предпочтительнее иметь возможность сделать все контроллеры безопасными по умолчанию, а затем внести в белый список те, которые должны быть общедоступными. Хотя я еще не придумал, как это сделать.
- person Brad Mace; 08.01.2011
Я сделал именно это, обрабатывая входящие запросы глобально в классе 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);
}
Вы можете просто использовать PlayPlugin для решения этой проблемы. Подробнее см. здесь.
Расширять базовый контроллер для всех ваших контроллеров и иметь @Before в базовом контроллере — не лучшее решение.
Вы можете расширить фильтр или основной фильтр, например.
класс filter1 расширяет фильтр {}
и примените filter1 к Global
@With
ко всем контроллерам, но это привело меня к следующему вопросу: stackoverflow.com/questions/4608883/ - person Brad Mace   schedule 08.01.2011