2012-06-09 3 views
0

в моем приложении java ee, я не могу реализовать функцию выхода из системы. это то, что происходит, когда я пытаюсь реализовать его: у меня есть header.xhtml, который Header Css часть моего приложения: header.xhtml: (код для выхода из системы)управляемый bean logout не работает

<div class="userid-link"><img src="images/app.png" alt=""/><p><a href="#{loginBean.logoutAction()}">Logout</a></p></div> 

код для выхода из системы: loginBean. Java

public String logoutAction() 
    { 
     HttpServletRequest req=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
try{ 
    HttpSession session=req.getSession(); 
    session.invalidate(); 
     // req.logout(); 
     } 
catch(Exception e) 
     { 

     } 
     return"equityVolume.xhtml"; 
    } 

ошибка:

SEVERE: Error Rendering View[/ClientTemplate/userWatch.xhtml] 
javax.el.ELException: /ClientTemplate/userWatch.xhtml @44,62 value="#{watchBean.ut}": java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) 

... 
INFO: Exception when handling error trying to reset the response. 
java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed 
    at... 

на дом страница загружается нормально, но когда я пытаюсь войти в систему, то userWatch.xhtml не отображается должным образом, и я получаю й e выше ошибки, css также не применяется.

watchBean.java

public List<UserTrack> getUt() { 
     HttpServletRequest req=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    HttpSession session=req.getSession();// debugged and found that the session is null, this methos executes after login i.e. on the userWatch.xhtml that is redirected after login from homePage 
    this.uname=(String)session.getAttribute("uname"); 
     ut=getAllUserTrack(uname); 
    return ut; 
    } 

, когда я удалить метод logOutAction вызова из header.xhtml, то все работает отлично, за исключением, что я получаю viewExpired ошибка при выходе:

<div class="userid-link"><img src="images/app.png" alt=""/><p><a href="#/homePage">Logout</a></p></div> 

как я решить Это?

+0

Пожалуйста, вы можете проверить его с помощью 'request.getSession (ложь)' и опубликовать результаты? – higuaro

+0

попробовал все же получить ту же ошибку :( – z22

+0

Ознакомьтесь со следующими ссылками: они описывают возможные решения для 'IllegalStateException', которые бросают на вас приложения: (http://stackoverflow.com/questions/8426121/cannot -create-a-session-after-the-response-has-been-commit-why) (http://stackoverflow.com/questions/5540695/pwc3999-cannot-create-a-session-after-the- ответ-был принят) (http://stackoverflow.com/questions/8072311/illegalstateexception-cannot-create-a-session-after-the-response-has-been-commi) – higuaro

ответ

0

Это неправильный способ попытаться вызвать метод в управляемом компоненте. Вы, вероятно, захотите:

<h:commandLink action="#{loginBean.logoutAction()}" value="Logout" /> 

Кроме того, как вы входите в систему? Если вы запускаете свой собственный механизм входа, то аннулирование сеанса, вероятно, будет хорошо, но если вы используете ограничения безопасности web.xml, вы должны использовать API-интерфейс API-интерфейса Java EE 6 для сервлетов.

1

Чтобы аннулировать сеанс, если ваш loginBean является SessionScoped управляемым компонентом и методы выхода из системы является методом этого управляемого компонента:

public void logout() { 
    // Invalidate session of a sessionscoped managed bean 
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
    try { 
     // Redirect to page you want after logout 
     FacesContext.getCurrentInstance().getExternalContext().redirect("<INSERT HERE THE PAGE YOU WANT TO REDIRECT(just the name like 'homepage')"); 

    } catch (IOException ex) { 
     Logger.getLogger(TravelerSession.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

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

На веб-странице, вы должны иметь что-то вроде этого:

<h:commandButton class="btn btn-info" action="#{loginBean.logout}" value="Log out" /> 

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

  • Нет связанных вопросов^_^