Java JSF目标不可访问,登录时会话超时时返回null

Java JSF目标不可访问,登录时会话超时时返回null,java,jsf,session,session-timeout,Java,Jsf,Session,Session Timeout,我最近尝试通过web.xml文件将系统升级为超时用户会话,设置为10分钟,并使用过滤器重定向到我的登录页面,以及阶段侦听器跟踪用户活动 我的登录bean在实例化时执行以下操作: private User user; //this already has getters/setters public LoginBean() { log.info("Instantiating Login Bean..."); if(!hasSessionData("user")) {

我最近尝试通过
web.xml
文件将系统升级为超时用户会话,设置为10分钟,并使用
过滤器
重定向到我的登录页面,以及
阶段侦听器
跟踪用户活动

我的登录bean在实例化时执行以下操作:

private User user; //this already has getters/setters

public LoginBean() {
    log.info("Instantiating Login Bean...");
    if(!hasSessionData("user")) {
        user = new User();
        Dealer dealer = new Dealer();
        user.setDealer(dealer);
        setSessionData("user",user);
    }       
}
这将打开登录表单,并使用
User
包含要提交的登录详细信息。但是,如果我在登录屏幕上停留超过10分钟(会话过期),并尝试登录,则会出现错误

Aug 01, 2013 10:32:20 AM com.sun.faces.lifecycle.ProcessValidationsPhase execute
WARNING: /Login30FrmView.xhtml @108,92 value="#{loginBean.user.dealerId}": Target Unreachable, 'user' returned null
javax.el.PropertyNotFoundException: /Login30FrmView.xhtml @108,92 value="#{loginBean.user.dealerId}": Target Unreachable, 'user' returned null
    at com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:92)
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:942)
    at javax.faces.component.UIInput.validate(UIInput.java:868)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1072)
    at javax.faces.component.UIInput.processValidators(UIInput.java:672)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
    at javax.faces.component.UIForm.processValidators(UIForm.java:234)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058)
    at org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447)
    at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:240)
    at org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463)
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
2013年8月1日上午10:32:20 com.sun.faces.lifecycle.Phase-doPhase 严重:JSF1054:(阶段ID:PROCESS_VALIDATIONS 3,视图ID:/Login30FrmView.xhtml)在阶段执行期间引发异常:javax.faces.event.PhaseEvent[source=com.sun.faces.lifecycle。LifecycleImpl@7d137b]

我想知道为什么用户在LoginBean仍然根据日志初始化时返回null。会话到期时,会话中的
user
也将到期,因此
if(!hasSessionData(“user”)
应返回true并再次初始化
user
。但若用户必须在页面加载时重新初始化,并且在页面上超时,那个么该怎么做呢?我的
过滤器
会在会话被破坏时重定向到登录,如下所示:

if (isSessionInvalid(httpServletRequest)) {
    String timeoutUrl = httpServletRequest.getContextPath() + "/" + getTimeoutPage();
          httpServletResponse.sendRedirect(timeoutUrl);
          System.out.println("Redirecting to login page");
          return;
          }
    }
但不知何故,我需要在表单提交和会话过期时触发它,但它似乎并没有像现在这样做……我对此没有太多经验,所以我想知道这是否可行?会话到期后,如何重新初始化用户的
表单提交

(请注意,刷新页面会使一切恢复正常,但如果我让可怕的错误消息出现,最终用户会抱怨我很多。)


编辑:我的登录提交使用
并指向我的
登录栏中的侦听器。是否有任何方法可以捕获是否提交了此文件,以便在出现上述情况时返回登录页面?这可能是一种可能的替代解决方案。我真的很想让这个错误消失,即使它会让用户在没有解释的情况下重新登录。

自从我找到解决方案以来,我一直在回答我自己的问题。我只需将这一行添加到我的登录表单中

<meta http-equiv="refresh" content="#{session.maxInactiveInterval}"/>


这将在超时前刷新表单以保留会话,从而确保会话中始终有
用户
,因为刷新将实例化bean并再次加载页面。

您是否在用户类中添加了
@SessionScoped
?您确定这是所有与stacktrace相关的吗(因为您没有显示所有托管bean配置):@MatheusFreitas我正在使用JSF 1.1,所以我使用faces-config.xml将其设置在会话范围内。正如我所说,登录工作完全正常,直到我在登录页面空闲足够长的时间以等待会话超时。@LuiggiMendoza我已经添加了完整的stacktrace。我还看到了所有相关的错误,我认为我的登录是唯一的;只是在y您在登录页面上停留的时间足以超时。刷新页面可使您正常登录。