JSF导航重定向到上一页

6 navigation jsf

用户成功登录系统后,系统会将用户重定向到主页.现在我的问题是,如果用户在没有登录系统的情况下点击查看帐户页面,系统会将用户重定向到登录页面.如果用户现在登录系统,系统会将用户重定向到主页,在这种情况下,任何方法都可以将用户重定向到上一页,即查看帐户页面而不是主页?

我尝试使用session

String url = (String)session.getAttribute("url");
if(url != null)
    response.sendRedirect(url);
else
    response.sendRedirect("homepage.faces");
Run Code Online (Sandbox Code Playgroud)

我将此代码置于public void doBtnAction(){}下,如果用户登录成功,则重定向到url.但我得到了这个错误

java.lang.IllegalStateException: Cannot forward after response has been committed
    com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 16

导致此异常是因为您调用response.sendRedirect()并且未阻止JSF呈现正常响应.您需要通知JSF它不需要通过添加来处理正常响应

FacesContext.getCurrentInstance().responseComplete(); 
Run Code Online (Sandbox Code Playgroud)

动作方法.

或者,甚至更好,只是不要HttpServletResponse从JSF的引擎盖下获得,而是做:

FacesContext.getCurrentInstance().getExternalContext().redirect(url);
Run Code Online (Sandbox Code Playgroud)

这将自动调用responseComplete(),它还可以保护您的代码免受不必要的Servlet API的影响.另请参阅ExternalContextAPI.


Mak*_*hev 0

您尚未描述用于身份验证的任何框架设施,因此我假设您在自己的代码中执行身份验证。也许,最简单的方法是在重定向到登录页面之前在会话中保存初始目的地,然后在成功登录后您可以检查此属性并重定向到正确的位置。特别是对于 JSF,您可以在处理登录的操作方法中执行此操作。实际上,我建议使用一些框架进行身份验证,例如 Spring Security,因为它可以开箱即用地执行此类操作,并且在您需要一些附加功能时扩展您的安全系统会更容易,尽管它需要一些功能附加配置