在用JSF做项目的时候,经常会碰到session timeout问题,比如部署在tomcat下的时候,默认的timeout时间为30分钟,则在30分钟以后,点击页面上的任何commandButton或commandLink都会导致抛出javax.faces.application.ViewExpiredException异常:
提供一种解决方式:
自定义PhaseListener,并且在RESTORE_VIEW阶段的beforePhase中进行处理
<lifecycle>
<phase-listener>com.tcb.flow.webui.jsf.listener.AuthenticationPhaseListener</phase-listener>
</lifecycle>
AuthenticationPhaseListener的代码如下:
package com.test.listener;
import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.test.Constants;
public class AuthenticationPhaseListener implements PhaseListener {
private static final Log logger = LogFactory.getLog(AuthenticationPhaseListener.class);
public void afterPhase(PhaseEvent event) {
// other operation
}
public void beforePhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
ExternalContext externalContext = context.getExternalContext();
HttpSession session = (HttpSession) externalContext.getSession(false);
boolean newSession = session == null || session.isNew();
boolean postBack = !externalContext.getRequestParameterMap().isEmpty();//form submit
if (newSession && postBack) {//timeout
ViewHandler viewHandler = context.getApplication().getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, "/index.jsp");
context.setViewRoot(viewRoot);
context.renderResponse();
try {
viewHandler.renderView(context, viewRoot);
context.responseComplete();
} catch (Exception e) {
throw new FacesException("Session is timeout", e);
}
}
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
如果是new session且是表单提交则跳转到登录页面。
【附faces-config.xml配置信息】
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<lifecycle>
<phase-listener>com.tcb.flow.webui.jsf.listener.AuthenticationPhaseListener</phase-listener>
</lifecycle>
<application>
<action-listener>com.tcb.flow.webui.jsf.listener.AuthenticationActionListener</action-listener>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
<message-bundle>resource.messages</message-bundle>
<resource-bundle>
<description>i18n message for framework</description>
<base-name>resource.messages</base-name>
<var>msg</var>
</resource-bundle>
<resource-bundle>
<description>i18n message for common action</description>
<base-name>com.action.package</base-name>
<var>comMsg</var>
</resource-bundle>
<resource-bundle>
<description>i18n message for action used by managing user</description>
<base-name>com.action.manage.package</base-name>
<var>mgrMsg</var>
</resource-bundle>
<resource-bundle>
<description>i18n message for system action</description>
<base-name>com.action.system.package</base-name>
<var>sysMsg</var>
</resource-bundle>
</application>
<navigation-rule>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>/common/systemMessage.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>index</from-outcome>
<to-view-id>/index.jsp</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>confirmLogout</from-outcome>
<to-view-id>/confirmLogout.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>viewLoginInfo</from-outcome>
<to-view-id>/common/viewLoginInfo.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
</faces-config>
分享到:
相关推荐
本篇文章将详细介绍如何在JSF中监测和处理session超时,特别是通过监听恢复视图阶段的`ViewExpiredException`异常。 首先,我们需要理解JSF的生命周期。JSF有多个阶段,包括恢复视图(Restore View)阶段。在这个...
【JSF Multiple Session一个典型解决方案】 JavaServer Faces (JSF) 是Java平台上的一个用于构建Web应用程序的MVC(Model-View-Controller)框架。在处理用户会话时,JSF可能会遇到多重会话的问题,这可能导致数据...
JSF提供了组件库、事件处理机制和生命周期管理,允许开发者通过声明式的方式处理UI逻辑,降低了前端开发的复杂性。 **Hibernate** 是一个流行的Java持久化框架,用于管理和操作数据库。它提供了对象关系映射(ORM)...
### JSF生命周期的事件处理 JavaServer Faces(简称JSF)是Java平台提供的一种用于构建企业级Web应用程序的标准框架。JSF通过定义一套简洁而强大的API来帮助开发者更轻松地开发用户界面。其中,JSF的生命周期管理...
**生命周期** 是JSF处理请求的关键过程,包括初始化、恢复视图、应用请求值、处理事件、更新模型值、渲染响应等阶段。开发者可以在这些阶段插入自定义的行为。 **JSF与Java EE集成** 是其强大的特点之一。它可以...
5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...
JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术框架,它提供了一种声明式的方法来创建用户界面,并且处理与后端数据模型的交互。在这个"jsf实现登录功能"的例子中,我们将探讨如何利用JSF来构建...
jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF
JSF(JavaServer Faces)是Java平台上用于构建用户界面的Web框架,尤其在处理表单和数据交互方面表现强大。本项目聚焦于JSF的文件上传功能,特别是针对大文件的上传,允许用户上传最大可达1.99GB的文件。在实际应用...
在JavaServer Faces (JSF)框架中,分页是一种常用的技术,用于处理大量数据时提供更好的用户体验。当数据集过大,一次性加载所有记录到页面上会导致性能下降且用户界面响应变慢。通过分页,我们可以将数据分成多个...
**事件处理**:JSF支持事件处理机制,允许组件之间通信。当用户触发一个事件(如点击按钮),对应的事件处理器会被调用,这使得组件间的交互变得简单而直观。 **渲染器**:渲染器负责将JSF组件转化为实际的HTML或...
《JSF入门简体中文版》是学习JSF的基础,它涵盖了JSF的基本架构、组件库、生命周期和事件处理等方面。书中会介绍如何创建一个简单的JSF应用程序,设置开发环境,以及如何使用JSF的UI组件来构建动态网页。此外,还会...
JSF(JavaServer Faces)是一种用于构建Web应用程序的Java技术,它提供了一种声明式的方式来创建用户界面,并处理用户交互。在这个"用jsf做的登录注册的组件"中,我们可能会涉及以下几个关键知识点: 1. **JSF架构*...
IBM的JSF资料可能会讲解如何创建和配置Managed Beans,以及如何在不同作用域(如request、session、application)中管理它们。 **7. EL(Expression Language)** EL是JSF中的表达式语言,用于在JSF组件和Managed ...
JSF的核心组件包括:视图(View)、控制器(Controller)、模型(Model)和会话管理(Session Management)。视图负责展示用户界面,控制器处理用户交互,模型承载业务逻辑,会话管理则处理用户的会话状态。 **3. ...
1. **JSF生命周期**:JSF有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑以及渲染响应。开发者可以在这些阶段插入自定义行为。 2. **JSF页面(Facelets)**:JSF使用Facelets...
JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...
在JSF中,**模型**负责处理业务逻辑,通常由Java Beans组成;**视图**是用户看到和交互的部分,可以通过JSF的UI组件实现;**控制器**则协调模型和视图之间的交互,处理用户请求并更新模型状态。JSF框架提供了丰富的...
JSF的核心组件包括UI组件、事件处理、数据绑定和转换验证。 ### 2. UI组件库 JSF 1.2提供了一套丰富的预定义UI组件,如按钮、输入字段、表格等。这些组件可以通过XML(Faces配置文件)或者在JSP页面上直接声明。...
总之,JSF文件下载功能的实现涉及到JSF上下文、Servlet上下文、HTTP响应头设置、文件流处理等多个关键环节。理解并熟练掌握这些知识点对于开发Web应用程序,特别是处理文件操作的场景非常重要。