我有一个 JSF2 应用程序。我有一个 session 范围的登录 bean 和一个 View 范围的注销 bean。当我登录时,我使用重定向并且工作正常。但是,注销因重定向而失败。如果我注销而不重定向它就可以了。
@ManagedBean
@ViewScoped
public class MbLogout extends BaseJsf {
private static final long serialVersionUID = 2992671241358926373L;
public String logout() throws DfException {
getFacesContext().getExternalContext().invalidateSession();
//return "login?faces-redirect=true"; // fails with this
return "login";
}
}
登录页面绑定(bind)到登录 bean,所以我怀疑这可能与它有关,尽管我不明白为什么它不起作用。错误是:
java.lang.IllegalStateException: Cannot create a session after the response has been committed
我的猜测是,由于我访问了 session bean,它正在尝试在登录页面上创建一个 session ,尽管我没有发现这有什么问题,而且它无需重定向即可工作。
我正在使用 MyFaces 2.1。
最佳答案
我建议使用 Servlet 而不是 Bean 进行注销,托管 Bean(尤其是 View 范围)不适合注销。例如:
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"}) // Can be configured in web.xml aswell
public class LogoutServlet extends HttpServlet {
private static final String redirectURL = "http://www.somepage.com";
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Destroys the session for this user.
if (request.getSession(false) != null) {
request.getSession(false).invalidate();
}
response.sendRedirect(redirectURL );
}
}
关于jsf-2 - 注销后重定向失败并出现 java.lang.IllegalStateException : Cannot create a session after the response has been committed ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9017487/