Как эмулировать wicket setResponsePage () в spring security


Ситуация : пользователь вынужден изменить пароль при нажатии кнопки "Изменить пароль". Этот щелчок запускает переопределенный метод onSubmit() (Wicket). В этом методе:

protected void onSubmit() {

   //changing password by updating it in DB

   // autologin user with changed password in system

   //set response page (wicket style)
    setResponsePage(RestorePasswordPage.class);
}

Фактически вызов setResponsePage(...) является вызовом к калитке компонента.setResponsePage ()

public final <C extends Page> void setResponsePage(final Class<C> cls)
{
    getRequestCycle().setResponsePage(cls);
}
Моя задача состояла в том, чтобы заменить калитку на Spring security, и она была решена-я перехватываю вызов этого метода в цепочке безопасности Spring Filter (класс ниже является одним из компонентов этого chaing). И может делать все вещи из приведенного выше фрагмента кода, кроме одного - я не знаю, как сделать перенаправление на RestorePasswordPage
public class ForgotPasswordForcePasswordChangeEventHandler implements CustomEventHandler {
    public void handle(HttpServletRequest request, HttpServletResponse response) {

       // 1. Extract current customer
       // 2. Extract changed password
       // 3. Updates user through external web service
       // 4. Prepares data for authentication
      // 5. Clears security context to remove current authentication

      //redirect to the same page as in wicket
          HOW???
   }
}

Вопросы :

  1. Есть ли способ получить доступ к Wicket RequestCycle, если я получил только HttpServletRequest запрос в качестве входных данных.
  2. Есть ли другой способ решить эту проблему?
2 4

2 ответа:

Wicket поддерживает" bookmarkable " pages - классы страниц, которые имеют конструктор без параметров или просто принимают объект PageParameters. (PageParameters-это абстракция над строковыми параметрами запроса и др.)

Если вам не нужно настраивать экземпляр страницы, на который выполняется перенаправление в коде, вы можете использовать WebApplication#mountPage внутри вашего WebApplication#init, Чтобы смонтировать его на" хорошем " статическом URL. Затем необходимо настроить пружину безопасности для перенаправления URL-адреса. IIRC, Spring Security перехватывает запрос перед калиткой вовлекается, поэтому нет необходимости и, вероятно, нет разумного способа получить доступ к обработке запросов Уикета.

Если вам действительно нужны параметры на странице, на которую вы перенаправляете, взгляните на документацию по отображению запроса . По существу, вы даете странице конструктор с аргументом PageParameters. Используя PageParameters, вы всегда можете получить доступ к любым параматерам, заданным в стандартной строке запроса, и" позиционным параметрам " (несопоставленным дополнительным компонентам URL) без какой-либо конфигурации. При монтаже страницы вы можно также определить "именованные" параметры (дополнительные компоненты URL, которые помещаются в карту PageParameters под предопределенными именами) и многое другое.

Вы можете выполнить перенаправление, бросив RestartResponseException.

throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);

Или

throw new RestartResponseException(new RestorePasswordPage(Object parameters));

RequestCycle, и другие элементы, такие как Session, автоматически сохраняются калиткой в ThreadLocal переменные, так что вы можете получить их, когда захотите, с помощью статических методов: RequestCycle.get()

Кстати, вот вопрос, уточняющий RestartResponseException: калитка: как перенаправить на другую страницу?