使用JSF2.0 Mojarra和JQuery使会话无效

时间:2013-02-03 19:49:20

标签: jsf-2

我想在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吗?如果不可能,可以建议任何其他方法吗?

1 个答案:

答案 0 :(得分:3)

FacesContextFacesServlet创建,因此仅在FacesServlet提供请求时才可用。换句话说,它只能在JSF工件中使用,例如托管bean,阶段监听器等,但绝对不能在"普通的香草"从JSF独立调用的servlet。

只需使用标准的servlet API方法,就像JSF正在使用"" (你知道,JSF是一个基于Servlet的MVC框架,而FacesServlet 是一个 servlet!)。要使会话无效,只需按ExternalContext#invalidateSession()进行exactly the same

request.getSession().invalidate();