1

我想在 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 必须已经初始化),我试图关闭窗口。我可以看到我的SessionTimeoutservlet 被调用但FacesContext.getCurrentInstance().getExternalContext().invalidateSession();正在抛出NullPointerException。为什么会这样?FacesContext在我的 servlet 中这个 AJAX 调用期间我看不到吗?如果以上是不可能的,有人可以建议任何其他方法吗?

4

1 回答 1

3

由.FacesContext创建,FacesServlet因此仅在 . 提供请求时可用FacesServlet。换句话说,它仅在 JSF 工件(如托管 bean、阶段侦听器等)中可用,但绝对不能在独立于 JSF 调用的“普通”servlet 中使用。

只需使用标准的 servlet API 方法,就像 JSF 使用“幕后”一样(你知道,JSF 是一个基于 Servlet 的 MVC 框架,哎呀,它FacesServlet 是一个servlet!)。要使会话无效,只需执行与正在执行的操作完全相同的ExternalContext#invalidateSession()操作即可。

request.getSession().invalidate();
于 2013-02-03T20:13:28.007 回答