如何在spring安全中模拟wicket setResponsePage()



情况:点击"修改密码"按钮,用户被强制修改密码。这个单击触发表单覆盖的方法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(…)是调用Wicket组件。setResponsePage()

public final <C extends Page> void setResponsePage(final Class<C> cls)
{
    getRequestCycle().setResponsePage(cls);
}

我的任务是在Spring安全性上替换wicket,并且它得到了解决-我在Spring过滤器安全链中拦截对该方法的调用(下面的类是该链的一个组件)。并且可以做上面代码片段中的所有事情,除了一个-我不知道如何重定向到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. 如果我只得到HttpServletRequest请求作为输入,是否有任何方法可以访问Wicket RequestCycle ?
  2. 还有其他办法解决这个问题吗?

Wicket支持"bookmarkable"页面——具有无参数构造函数的页面类,或者只接受PageParameters对象。(PageParameters是对查询字符串参数等的抽象)

如果您不需要在代码中定制被重定向到的页面实例,您可以在WebApplication#init中使用WebApplication#mountPage将其挂载到一个"漂亮"的静态URL。然后配置Spring Security以重定向到该URL。Spring Security在Wicket参与之前拦截请求,因此没有必要也可能没有相同的方法来访问Wicket的请求处理。

如果您确实需要重定向到的页面中的参数,请查看请求映射文档。本质上,您为页面提供一个带有PageParameters参数的构造函数。使用PageParameters,您总是可以访问标准查询字符串中给定的任何参数,以及无需任何配置的"位置参数"(未映射的额外URL组件)。在挂载页面时,您还可以定义"命名"参数(以预定义的名称放入PageParameters映射中的额外URL组件)和诸如此类的内容。

您可以通过抛出RestartResponseException来执行重定向。

throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);

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

RequestCycle和其他元素如Session被Wicket自动存储在ThreadLocal变量中,因此您可以随时通过静态方法获取它们:RequestCycle.get()

顺便说一下,这里有一个问题详细阐述RestartResponseException: Wicket:如何重定向到另一个页面?

最新更新