0

在我的 java ee 应用程序中,我无法实现注销功能。当我尝试实现它时会发生这种情况:我有一个 header.xhtml,其中包含我的应用程序的 header css 部分:header.xhtml:(注销代码)

<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 未正确呈现,并且出现上述错误,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;
    }

当我从 header.xhtml 中删除 logOutAction 方法调用时,一切正常,除了注销时出现 viewExpired 错误:

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

我该如何解决?

4

2 回答 2

1

To invalidate session if your loginBean is a SessionScoped managed bean and logout method is a method of that managed bean:

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

}

You can either redirect to page you want on the method or return the name of the page you want to go. I think it's safer by doing in the method of the bean.

On the webpage you should have something like this:

<h:commandButton class="btn btn-info" action="#{loginBean.logout}" value="Log out" />
于 2014-05-03T22:39:58.143 回答
0

这是尝试在托管 bean 中调用方法的错误方法。你可能想要:

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

还有,你是怎么登录的?如果您使用自己的登录机制,那么使会话无效可能没问题,但如果您使用 web.xml 安全约束,那么您应该使用 Java EE 6 用于 servlet 的编程登录 API。

于 2012-06-13T02:11:40.937 回答