jsf-2 - 注销后重定向失败并出现 java.lang.IllegalStateException : Cannot create a session after the response has been committed

标签 jsf-2 myfaces

我有一个 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/

相关文章:

jsf-2 - 重定向到已配置的 <error-page> 时出现异常 (HTTP 500)

java - 以编程方式禁用在 Intranet 中运行并呈现 .xhtml 页面的站点的 IE-8 兼容模式

ajax - 使用 servlet 过滤器中的请求参数将 JSF ajax 请求重定向到 URL

jsf-2 - Icesfaces vs Myfaces vs Primefaces

jsf - MyFaces + CDI 可以在 WebLogic 12c 上使用吗?

java - 自动生成的 JSF 组件 ID 中存在重复 ID

java - 查看范围 bean 注入(inject)应用程序范围并修改应用程序范围数据。不好的做法?

java - JSF 2.0 - 更改组件样式

spring - JSF 2.0、Spring 3.1 和 Hibernate 4.0 集成

部署 Tomcat6 JSF 应用程序时出现解析错误 - digester.Digester