Перехватить запрос и проверить авторизацию в playframework
я используюplay framework 2.4.2
с Java, и я хочу проверить, что пользователь вошел в систему, перехватывая все запросы и проверяя, установлено ли значение сеанса. Так что я продлилDefaultHttpRequestHandler и переопределитьcreateAction
Способ перехвата всех запросов. Однако я не нашел хорошего способа проверить сессию.
Когда я пытаюсь получить значение сеанса, я получаю исключение времени выполнения:There is no HTTP Context available from here
Ниже приведен класс, с которым я работаю:
public class RequestHandler extends DefaultHttpRequestHandler {
@Override
public Action createAction(Http.Request request, Method method) {
session("loggedIn"); // Throws runtime Exception: no HTTP Context
}
}
Вариант 2 - ГадкийТак как сессия технически является cookie, я могу извлечь значение из заголовка с помощью кода, подобного следующему:
for(String cookie : request.headers().get("Cookie")){
System.out.println("cookie: "+cookie);
}
Но затем мне нужно проанализировать строку cookie, которая выглядит как следующая строка, чтобы получить значение loggedIn. Чтобы грязно на мой вкус.
_ga=GA1.1.1508004144.1421266376; ki_r=; ki_t=1438789543788%378129908%3B1438789543788%3B1%3B1; PLAY_SESSION=0570411c3eb55ad230681539ddcfaa4220583fd-loggedIn=1
Вариант 3 - Слишком легко забыть аннотациюЯ замечаю, что некоторые сайты документируют другой подход и вместо этого создают
композиция действия и добавьте соответствующую аннотацию к каждому классу контроллера или методу.
Проблема с этим подходом заключается в том, что разработчик должен не забыть добавить аннотацию. Я бы предпочел отменить это, чтобы заблокировать каждый маршрут по умолчанию, а затем добавить аннотацию к маршрутам, которые не нуждаются в проверке.
Пара сайтов, которые документируют состав действий:
http://alexgaribay.com/2014/06/16/authentication-in-play-framework-using-java/https://www.playframework.com/documentation/2.2.1/JavaGuide4ВопросЕсть ли способ глобальной проверки, если у пользователя должен быть доступ к странице, и как мне получить переменную сеанса?
* Обратите внимание, что я не заинтересован в использовании стороннего плагина для аутентификации.