注销失败后使用java.lang.IllegalStateException重定向:在提交响应后无法创建会话

时间:2012-01-26 11:28:41

标签: jsf-2 myfaces

我有一个JSF2应用程序。我有一个会话作用域的登录bean和一个视图作用域的注销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";
    }
}

登录页面绑定了登录bean,所以我怀疑这可能与它有关,虽然我不明白为什么它不起作用。错误是:

java.lang.IllegalStateException: Cannot create a session after the response has been committed

我的猜测是,我尝试在登录页面上创建一个会话,因为我访问会话bean虽然我没有看到任何错误,但它没有重定向。

我正在使用MyFaces 2.1。

2 个答案:

答案 0 :(得分:3)

我建议使用Servlet而不是bean来注销,托管bean(特别是视图作用域)不适合注销。例如:

@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 );
    }
}

答案 1 :(得分:0)

它似乎与视图范围中的bean有关,它本身应该在会话中序列化。请改为使用作用域。无论如何,视图范围对于注销没有多大意义。

@ManagedBean
@RequestScoped
public class MbLogout extends BaseJsf {
    // ...
}