`
can4you
  • 浏览: 101167 次
  • 性别: Icon_minigender_1
  • 来自: 天朝
社区版块
存档分类
最新评论

JSF Session timeout处理

    博客分类:
  • JSF
阅读更多

在用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超时

    本篇文章将详细介绍如何在JSF中监测和处理session超时,特别是通过监听恢复视图阶段的`ViewExpiredException`异常。 首先,我们需要理解JSF的生命周期。JSF有多个阶段,包括恢复视图(Restore View)阶段。在这个...

    JSF Multiple Session都一個典型解決

    【JSF Multiple Session一个典型解决方案】 JavaServer Faces (JSF) 是Java平台上的一个用于构建Web应用程序的MVC(Model-View-Controller)框架。在处理用户会话时,JSF可能会遇到多重会话的问题,这可能导致数据...

    JSF与hibernate整合的登陆

    JSF提供了组件库、事件处理机制和生命周期管理,允许开发者通过声明式的方式处理UI逻辑,降低了前端开发的复杂性。 **Hibernate** 是一个流行的Java持久化框架,用于管理和操作数据库。它提供了对象关系映射(ORM)...

    JSF生命周期的事件处理

    ### JSF生命周期的事件处理 JavaServer Faces(简称JSF)是Java平台提供的一种用于构建企业级Web应用程序的标准框架。JSF通过定义一套简洁而强大的API来帮助开发者更轻松地开发用户界面。其中,JSF的生命周期管理...

    JSF中文教程jsf

    **生命周期** 是JSF处理请求的关键过程,包括初始化、恢复视图、应用请求值、处理事件、更新模型值、渲染响应等阶段。开发者可以在这些阶段插入自定义的行为。 **JSF与Java EE集成** 是其强大的特点之一。它可以...

    JSF的工作方式 JSF架构 JSF模型 JSF事件类型

    5. **调用应用程序(Invoke Application)**:在这个阶段,JSF会调用应用程序中的方法来处理事件。例如,如果用户点击了一个按钮,JSF会执行对应的动作方法,该方法通常在管理Bean中定义。 6. **呈现响应(Render ...

    jsf实现登录功能

    JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术框架,它提供了一种声明式的方法来创建用户界面,并且处理与后端数据模型的交互。在这个"jsf实现登录功能"的例子中,我们将探讨如何利用JSF来构建...

    jsf实例jsf实例 JSF学习 JSF jar包 JSF

    jsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSFjsf实例 JSF学习 JSF jar包 JSF jsf实例 JSF学习 JSF jar包 JSF

    JSF上传 JSF大文件上传 JSF上传代码 JSF上传源代码

    JSF(JavaServer Faces)是Java平台上用于构建用户界面的Web框架,尤其在处理表单和数据交互方面表现强大。本项目聚焦于JSF的文件上传功能,特别是针对大文件的上传,允许用户上传最大可达1.99GB的文件。在实际应用...

    jsf分页 jsf分页 jsf分页

    在JavaServer Faces (JSF)框架中,分页是一种常用的技术,用于处理大量数据时提供更好的用户体验。当数据集过大,一次性加载所有记录到页面上会导致性能下降且用户界面响应变慢。通过分页,我们可以将数据分成多个...

    JSF包,jsf包,JSF包,jsf包

    **事件处理**:JSF支持事件处理机制,允许组件之间通信。当用户触发一个事件(如点击按钮),对应的事件处理器会被调用,这使得组件间的交互变得简单而直观。 **渲染器**:渲染器负责将JSF组件转化为实际的HTML或...

    JSF入门+JSF web实战+JSF2

    《JSF入门简体中文版》是学习JSF的基础,它涵盖了JSF的基本架构、组件库、生命周期和事件处理等方面。书中会介绍如何创建一个简单的JSF应用程序,设置开发环境,以及如何使用JSF的UI组件来构建动态网页。此外,还会...

    用jsf做的登录注册的组件

    JSF(JavaServer Faces)是一种用于构建Web应用程序的Java技术,它提供了一种声明式的方式来创建用户界面,并处理用户交互。在这个"用jsf做的登录注册的组件"中,我们可能会涉及以下几个关键知识点: 1. **JSF架构*...

    IBM JSF学习资料

    IBM的JSF资料可能会讲解如何创建和配置Managed Beans,以及如何在不同作用域(如request、session、application)中管理它们。 **7. EL(Expression Language)** EL是JSF中的表达式语言,用于在JSF组件和Managed ...

    精通JSF中文教程精通JSF中文教程

    JSF的核心组件包括:视图(View)、控制器(Controller)、模型(Model)和会话管理(Session Management)。视图负责展示用户界面,控制器处理用户交互,模型承载业务逻辑,会话管理则处理用户的会话状态。 **3. ...

    jsf第一个例子 jsf架包 jsf实例

    1. **JSF生命周期**:JSF有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用业务逻辑以及渲染响应。开发者可以在这些阶段插入自定义行为。 2. **JSF页面(Facelets)**:JSF使用Facelets...

    JSF Java Server Faces (JSF)框架

    JSF是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。JSF(Java Server Faces)技术为开发基于网络用户界面的Java开发者提供了标准的编程接口API以及标签库。就像Struts框架...

    jsf

    在JSF中,**模型**负责处理业务逻辑,通常由Java Beans组成;**视图**是用户看到和交互的部分,可以通过JSF的UI组件实现;**控制器**则协调模型和视图之间的交互,处理用户请求并更新模型状态。JSF框架提供了丰富的...

    core jsf 1.2 jsf 核心

    JSF的核心组件包括UI组件、事件处理、数据绑定和转换验证。 ### 2. UI组件库 JSF 1.2提供了一套丰富的预定义UI组件,如按钮、输入字段、表格等。这些组件可以通过XML(Faces配置文件)或者在JSP页面上直接声明。...

    JSF的一个实例

    控制器由JSF生命周期处理,该生命周期包括六步:恢复视图、应用请求值、处理验证、更新模型值、调用应用事件和渲染响应。 在"UserLogin"这个实例中,我们可能会有一个`UserLogin.xhtml`文件,它包含了登录表单的...

Global site tag (gtag.js) - Google Analytics