2012-01-26 1 views
2

У меня есть приложение JSF2. У меня есть логин, который является областью сеанса, и компонент выхода из системы, который доступен для просмотра. Когда я вхожу в систему, я использую перенаправление, и он отлично работает. Однако выход из системы не выполняется с переадресацией. Если я выхожу из системы без перенаправления, он работает.Перенаправление после выхода из системы с ошибкой с помощью java.lang.IllegalStateException: невозможно создать сеанс после того, как ответ был получен

@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.

ответ

3

Я бы рекомендовал использовать сервлет, а не компонент для выхода из системы, управляемый компонент (в частности, область просмотра) не подходит для выхода из системы. Например:

@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

Это хорошая идея, не подумал об этом. Я попробую. благодаря – rozner

0

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

@ManagedBean 
@RequestScoped 
public class MbLogout extends BaseJsf { 
    // ... 
} 
Смежные вопросы

 Смежные вопросы