我想在JSF2.0中关闭窗口期间使会话无效。所以我在下面的代码中写道:
var preventUnloadPrompt;
var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
$('a').live('click', function() {
preventUnloadPrompt = true;
});
$('form').live('submit', function() {
preventUnloadPrompt = true;
});
$(window).bind("beforeunload", function(e) {
var rval;
if (preventUnloadPrompt) {
return;
} else {
// return messageBeforeUnload;
doInvalidate();
}
return rval;
});
function doInvalidate()
{
$.ajax({
url: "http://localhost:8080/MyPrj/SessionTimeout",
type: 'GET'
});
}
我的servlet如下:
public class SessionTimeout extends HttpServlet {
.....
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.err.println("IN SESSION TIMEOUT GET!!!");
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}
.....
}
启动我的第一个JSF2.0页面(此时FacesContext必须已初始化),我试图关闭窗口。我可以看到我的SessionTimeout
servlet被调用,但FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
正在抛出NullPointerException
。为什么会这样?在我的servlet中,在AJAX调用期间无法看到FacesContext
吗?如果不可能,可以建议任何其他方法吗?
答案 0 :(得分:3)
FacesContext
由FacesServlet
创建,因此仅在FacesServlet
提供请求时才可用。换句话说,它只能在JSF工件中使用,例如托管bean,阶段监听器等,但绝对不能在"普通的香草"从JSF独立调用的servlet。
只需使用标准的servlet API方法,就像JSF正在使用"" (你知道,JSF是一个基于Servlet的MVC框架,而FacesServlet
是一个 servlet!)。要使会话无效,只需按ExternalContext#invalidateSession()
进行exactly the same。
request.getSession().invalidate();