情境:点击“更改密码”按钮后,用户被迫更改密码。此单击触发表单重写方法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???
}
}
问题:
答案 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?