1

我希望我的会话在给定的时间间隔后超时。在 web.xml 中,我一直在使用如下代码:

<session-config>   
  <session-timeout>20</session-timeout>   
</session-config>   

其中 20 是以分钟为单位的超时时间,它可以正常工作。

我想做的是在我的一个bean中使用这样的代码以编程方式执行它,如下所示:

@ManagedBean(name="login")   
@SessionScoped  
public class MyLoginBean implements HttpSessionListener, Serializable {   

    // private variables etc.   

    HttpServletRequest request;   
    HttpSession session  = request.getSession();   

    // Constructor
    public MyLoginBean() {   
        session.setMaxInactiveInterval(1200);   
    }   

// The rest of the code   

}  

这里的超时时间是 1200 秒,即 20 分钟。不幸的是,在打开浏览器查看应用程序时,它失败并显示以下消息:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.csharp.MyLoginBean. 

其次是:

java.lang.NullPointerException 

我在这里做错了什么?我知道这setMaxInactiveInterval()指的是特定的会话,在这种情况下是登录 bean,而不是web.xml文件中的代码指定的所有内容。我有几个 bean,但是让登录 bean 超时是唯一重要的。

我将 JSF 2.0 与 Glassfish 3.1.1 和 Eclipse Indigo 一起使用,因此非常感谢一些建议。

4

1 回答 1

4

NullPointerException有一个非常简单的原因。这是最简单的例外之一。要了解任意异常的原因,只需查看其 javadoc。所有 Java 异常的原因在 javadoc 中都有解释。这是javadocNullPointerException的摘录:

当应用程序在需要对象的情况下尝试使用 null 时引发。这些包括:

  • 调用null对象的实例方法。
  • 访问或修改null对象的字段。
  • null就好像它是一个数组一样的长度。
  • 访问或修改 的插槽,null就好像它是一个数组一样。
  • null像 Throwable 值一样进行投掷。

应用程序应抛出此类的实例以指示空对象的其他非法使用。

您的问题是由第 1 点引起的。在这里,

HttpServletRequest request;   
HttpSession session  = request.getSession();   

您正在尝试调用getSession()方法null而不是具体HttpServletRequest实例。实际上,您应该已经获得了HttpServletRequestviaExternalContext#getRequest()并将其分配给request.

但是,您有更大的问题:您绝对不应该将当前的 servlet 请求作为会话范围 bean 的属性(它的寿命比 HTTP 请求长!)。您应该在线程本地范围内获取它(即完全在构造函数或方法块内)。您也不应该让您的 JSF 托管 bean 实现HttpSessionListener. 这完全没有意义。您最终会得到 2 个实例,一个由容器创建为侦听器,另一个由 JSF 创建为托管 bean。

就这样应该这样做:

@ManagedBean(name="login")
@SessionScoped
public class MyLoginBean implements Serializable {

    public MyLoginBean() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
        session.setMaxInactiveInterval(1200);
    }

    // ...
}

或者,如果您使用的是 JSF 2.1,请使用以下提供的版本ExternalContext

FacesContext.getCurrentInstance().getExternalContext().setSessionMaxInactiveInterval(1200);
于 2013-01-29T12:15:42.993 回答