一旦用户成功登录到系统,该系统将用户重定向到首页。 现在,我的问题是,如果用户在查看帐户页面上点击不登录到系统中,系统将用户重定向到登录页面。 如果用户登录到系统现在系统会将用户重定向到主页,在这种情况下,任何方法都可以用户重定向到前一页是查看帐户页面,而不是主页?
我尝试使用会话
String url = (String)session.getAttribute("url");
if(url != null)
response.sendRedirect(url);
else
response.sendRedirect("homepage.faces");
我把这个代码下公共无效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)
因为你叫这个异常是造成response.sendRedirect()
并没有从渲染正常响应块JSF。 您需要通知JSF,它并不需要处理,加入的正常反应
FacesContext.getCurrentInstance().responseComplete();
的动作方法。
或者,甚至更好,只是没有得到HttpServletResponse
从JSF的罩下,而是做:
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
这将自动调用responseComplete()
它也让你的代码不必要的Servlet API的东西干净。 另见ExternalContext
API 。
不知道,但尝试过这样做ExternalContext
设施:
事情是这样的:
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.redirect(externalContext.encodeResourceURL(externalContext.getRequestContextPath()+getUrl()));
You haven't described any framework facilities you use for authentication so I assume that you perform authentication in own code. Probably, the simplest approach would be to save initial destination in session before redirecting to the login page, and then after successful login you can check this attribute and redirect to right place.
I particular for JSF you can do this in action method that processes login.
Actually, I'd suggest to use some framework for authentication, for example Spring Security, because it does such things out of box, and it will be much easier to extend your security system in case you need some additional features, though it needs some additional configuration
逻辑描述(登录重定向)应当通过过滤力学来实现。 你也可以尝试标准JSF导航规则(如果它能够适合你的情况)。 如果你仍然想发送重定向到一个自定义的URL,并且不希望使用的过滤器,做在你的servlet中呈现阶段,而不是在JSF的bean。
java.lang.IllegalStateException:无法向前后反应一直致力于
唯一的例外是相当清楚的:
什么没有意义?
你来得太晚了,并且是给你的例外。 这样做在渲染响应阶段前的PhaseListener。
在web.xml中放置下面的语法应该工作:
<context-param>
<param-name>com.sun.faces.writeStateAtFormEnd</param-name>
<param-value>false</param-value>
</context-param>