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

Java 如何在spring security中模拟wicket setResponsePage(),java,spring-security,wicket,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(Re

情况:单击“更改密码”按钮时,用户被迫更改密码。此单击触发表单重写方法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()

问题

  • 如果我只得到HttpServletRequest请求作为输入,是否有任何方法可以访问Wicket RequestCycle
  • 还有别的办法解决这个问题吗

  • 您可以通过抛出一个命令来执行重定向

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

    顺便提一下,这里有一个问题详细说明了
    RestartResponseException

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

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


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

    +1,这是将Wicket与事件句柄分离的好方法。请提供更多详细信息?使用导叶1.4.9。要从处理程序重定向,我可以使用
    response.sendRedirect(…)
    ,它将字符串作为参数。要装载页面,我使用
    WebApplication.mountBookmarkablePage(request.getContextPath(),RestorePasswordPage.class))
    但这是void方法。如何正确执行重定向?要挂载页面,请使用
    WebApplication.mountBookmarkablePage(“/forget password”,RestorePasswordPage.class”)。要重定向,请使用
    response.sendRedirect(request.getContextPath()+“/忘记密码”)
    。路径(“/忘记密码”)可以自由选择,只是在装载页面和执行重定向时必须相同。(最好使用常量)谢谢您的回复。最后一刻:Spring安全过滤器链在web.xml中配置为调用Previor ServletDispatcher,它实际上将请求重定向到wicket控制器。因此,当我调用WebApplication.get()以获取所述处理程序(即Spr.Sec.Filter链的一部分)中的wicket应用程序类时,我得到了WicketRuntimeException“当前线程没有附加任何应用程序”。也许你知道解决这个问题的方法?不是用心的。如果您正在处理一个单独的问题,您应该发布另一个问题,其中包含您现在要完成的任务。我试图抛出一个异常,但它没有帮助。它触发RestartResponseException.constructor调用。但是constructor:RequestCycle.get()中的这个调用总是返回null,所以我得到了NullPointerException。在Wicket能够正常工作之前,Spring会截获调用。
    public final <C extends Page> void setResponsePage(final Class<C> cls)
    {
        getRequestCycle().setResponsePage(cls);
    }
    
    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???
       }
    }
    
    throw new RestartResponseException(RestorePasswordPage.class, somePageParameters);
    
    throw new RestartResponseException(new RestorePasswordPage(Object parameters));