如何在spring security中模拟wicket setResponsePage()

时间:2011-09-30 10:26:59

标签: java spring-security wicket

情境:点击“更改密码”按钮后,用户被迫更改密码。此单击触发表单重写方法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 Component.setResponsePage()的调用

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

我的任务是用Spring替换wicket并解决它 - 我在Spring Filter Security Chain中拦截了对这个方法的调用(下面的类是这个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. 如果我只获得HttpServletRequest请求作为输入,是否可以访问Wicket RequestCycle。
  2. 解决这个问题的其他任何方法?

2 个答案:

答案 0 :(得分:3)

Wicket支持“可收藏”页面 - 具有无参数构造函数的页面类,或者只接受PageParameters对象。 (PageParameters是对查询字符串参数等的抽象)

如果您不需要自定义在代码中重定向到的页面实例,则可以使用WebApplication#init内的WebApplication#mountPage将其挂载到“漂亮”的静态URL。然后,将Spring Security配置为重定向到该URL。 IIRC,Spring Security在Wicket介入之前拦截了请求,因此没有必要也可能没有理智的方式来访问Wicket的请求处理。

如果您确实需要重定向到的页面中的参数,请查看request mapping documentation。实质上,您为页面提供了一个带有PageParameters参数的构造函数。使用PageParameters,您始终可以访问标准查询字符串中给出的任何参数,以及“位置参数”(未映射的额外URL组件),无需任何配置。安装页面时,您还可以定义“命名”参数(在预定义名称下放入PageParameters映射的额外URL组件)等等。

答案 1 :(得分:2)

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

throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);

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

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

顺便说一下,这是一个关于RestartResponseException详细阐述的问题:Wicket: how to redirect to another page?