Перенаправление после сбоя выхода из системы с java.lang.IllegalStateException: не может создать сеанс после того, как ответ был принят - PullRequest
2 голосов
/ 26 января 2012

У меня есть приложение JSF2.У меня есть бин входа в систему, который является областью сеанса, и компонентом выхода из системы, который является областью видимости.Когда я вхожу, я использую редирект, и он работает нормально.Однако выход из системы завершается с перенаправлением.Если я выхожу без перенаправления, это работает.

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

Страница входа имеет привязки к бину входа в систему, поэтому я подозреваю, что это может иметь какое-то отношение к этому, хотя я не понимаю, почему это не работает,Ошибка:

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

Я предполагаю, что он пытается создать сеанс на странице входа в систему, так как я получаю доступ к сессионному компоненту, хотя я не вижу в этом ничего плохого, и он работает без перенаправления.

Я использую MyFaces 2.1.

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Я бы порекомендовал использовать 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 );
    }
}
0 голосов
/ 26 января 2012

Похоже, это связано с тем, что bean-компонент находится в области видимости, которая должна быть сериализована в сеансе.Сделайте так, чтобы запрос был ограничен.В любом случае область просмотра не имеет особого смысла для выхода из системы.

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