在JSF中注销后再次尝试登录时出现ServletException

在JSF中注销后再次尝试登录时出现ServletException,jsf,bootsfaces,Jsf,Bootsfaces,我正在努力解决一个问题,我试图从导航栏注销。每次我从会话中注销并尝试再次登录时,在执行登录过程后,系统就会因ServletException错误而崩溃,几乎没有反馈 当您第一次注销时,它执行得很顺利,它只是将您重定向到索引,仅此而已。在您再次登录并尝试再次执行注销后,会出现一个弹出窗口,例如,当您尝试刷新填充有数据的表单时,会出现该窗口 以下代码位于.xhtml代码段中,它是负责执行注销的navCommandLink <b:navCommandLink ic

我正在努力解决一个问题,我试图从导航栏注销。每次我从会话中注销并尝试再次登录时,在执行登录过程后,系统就会因ServletException错误而崩溃,几乎没有反馈

当您第一次注销时,它执行得很顺利,它只是将您重定向到索引,仅此而已。在您再次登录并尝试再次执行注销后,会出现一个弹出窗口,例如,当您尝试刷新填充有数据的表单时,会出现该窗口

以下代码位于.xhtml代码段中,它是负责执行注销的
navCommandLink

                <b:navCommandLink iconAwesome="power-off"
                    action="#{navbar.logout()}">
                    <span style="margin-left: 10px;">Logout</span>
                </b:navCommandLink>

注销
行动的代码如下

public String logout() {
    Map<String, Object> session = FacesContext.getCurrentInstance()
            .getExternalContext().getSessionMap();
    session.remove("LOGGEDIN_USER");

    FacesContext.getCurrentInstance().getExternalContext()
            .invalidateSession();
    return "index";
}
公共字符串注销(){
映射会话=FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap();
删除(“LOGGEDIN_用户”);
FacesContext.getCurrentInstance().getExternalContext()
.invalidateSession();
返回“索引”;
}

它应该返回到
index.xhtml
页面,就这样。

每个问题都应该有一个正确的答案,所以让我重复评论中给出的答案。问题是,使会话无效会阻止您触发JSF导航。因此,您必须找到一种替代方法,例如通过JavaScript导航或使用
externalContext.redirect(externalContext.getContextName()+“/index.xhtml”)。另外,请阅读评论以了解更多信息。

每个问题都应该有正确的答案,因此让我重复评论中给出的答案。问题是,使会话无效会阻止您触发JSF导航。因此,您必须找到一种替代方法,例如通过JavaScript导航或使用
externalContext.redirect(externalContext.getContextName()+“/index.xhtml”)。另外,请阅读评论以了解更多信息。

我不确定,但我认为在使会话无效后您不能执行操作,因为bean将被销毁。尝试此
公共字符串注销(){FacesContext FacesContext=FacesContext.getCurrentInstance();ExternalContext ExternalContext=FacesContext.getExternalContext();ExternalContext.invalidateSession();ExternalContext.redirect(ExternalContext.getContextName()+“/index.xhtml”);返回null;}
@MitchBroadhead感谢您的回复。但是使用externalContext使重定向变得不可能。如果索引在
myproject/index.xhtml
中,它只会让我进入
myproject/myproject/index.xhtml
,如果我只在方法中留下“/index.xhtml”,它只会把我带到项目范围之外。试试
@Inject private-HttpServletRequest HttpServletRequest。。。私有字符串baseUrl(){StringBuffer url=httpServletRequest.getRequestURL();字符串uri=httpServletRequest.getRequestURI();/String ctx=httpServletRequest.getContextPath();字符串base=url.substring(0,url.length()-uri.length()+ctx.length())+“/”;返回基;}
然后使用
externalContext.redirect(baseUrl())顺便问一下,它不应该使用ajax吗<代码>
我不确定,但我认为您不能在使会话无效后执行操作,因为bean将被销毁。尝试此
公共字符串注销(){FacesContext FacesContext=FacesContext.getCurrentInstance();ExternalContext ExternalContext=FacesContext.getExternalContext();ExternalContext.invalidateSession();ExternalContext.redirect(ExternalContext.getContextName()+“/index.xhtml”);返回null;}
@MitchBroadhead感谢您的回复。但是使用externalContext使重定向变得不可能。如果索引在
myproject/index.xhtml
中,它只会让我进入
myproject/myproject/index.xhtml
,如果我只在方法中留下“/index.xhtml”,它只会把我带到项目范围之外。试试
@Inject private-HttpServletRequest HttpServletRequest。。。私有字符串baseUrl(){StringBuffer url=httpServletRequest.getRequestURL();字符串uri=httpServletRequest.getRequestURI();/String ctx=httpServletRequest.getContextPath();字符串base=url.substring(0,url.length()-uri.length()+ctx.length())+“/”;返回基;}
然后使用
externalContext.redirect(baseUrl())顺便问一下,它不应该使用ajax吗<代码>