JSF导航重定向到上一页

时间:2009-07-22 12:39:09

标签: jsf navigation

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

我尝试使用会话

String url = (String)session.getAttribute("url");
if(url != null)
    response.sendRedirect(url);
else
    response.sendRedirect("homepage.faces");

如果用户登录成功,则将此代码置于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)

7 个答案:

答案 0 :(得分:15)

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

来处理正常响应
FacesContext.getCurrentInstance().responseComplete(); 

到行动方法。

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

FacesContext.getCurrentInstance().getExternalContext().redirect(url);

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

答案 1 :(得分:2)

不确定,但尝试通过ExternalContext工具执行此操作:

这样的事情:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl()));

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

java.lang.IllegalStateException:在提交响应后无法转发

例外很清楚:

  • 已提交回复。
  • 提交回复后,您无法转发。

什么没有意义?

答案 4 :(得分:0)

描述的逻辑(登录重定向)应该通过过滤器机制来实现。您也可以尝试标准的jsf导航规则(如果它适合您的情况)。如果您仍想将重定向发送到自定义URL并且不想使用过滤器,请在呈现阶段的servlet中执行此操作,而不是在jsf bean中执行。

答案 5 :(得分:-2)

你太迟了,这给了你例外。在渲染响应阶段之前的阶段中执行此操作。

答案 6 :(得分:-2)

将以下语法放在 web.xml 中应该有效:

<context-param>
<param-name>com.sun.faces.writeStateAtFormEnd</param-name>
<param-value>false</param-value>
</context-param>