`
daoger
  • 浏览: 529716 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

Liferay中ajax应用用户session超时

阅读更多
基于Liferay Portal开发ajax应用时,如果长时间操作一个应用会发生用户登录超时的情况,在单应用的情况下,客户端每次提交请求时,服务端都会根据sessionid更新客户端用户的session状态。
但是在portal中,ajax的处理类不能继承PortletAction类,如果继承PortletAction来处理ajax请求,response写回的是整个页面;在进行了自己的处理以后portal已经强制对response进行了回写操作。Liferay 5.1.2版本中的处理是处理类继承com.liferay.portal.struts.AJAXAction类,但是AJAXAction也是直接继承自struts 1的org.apache.struts.action.Action类,AJAXAction类中只不过是添加了
public abstract String getText(
			ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response)
		throws Exception;
方法来让我们自己设置回写的xml或text数据,com.liferay.portal.struts.JSONAction类中的情况也差不多。这些处理都没有经过portal容器,自然portal就不会更新用户的session状态,出现用户登录超时的情况也就在所难免。
大概看了一下,Liferay的单点登录实现,一般单点登录的实现都借助于客户端的cookie,所以这不单单是服务器端的问题。Liferay Portal中客户端会用脚本JavaScript去检测用户的session时间,在每一次刷新页面的时候更新客户端用户在cookie中的登录时间,同时也通知服务器端更新用户的session状态。可以在session超时的警告页面html\common\themes\session_timeout.jsp中扩展登录时间,扩展时间在portal-impl包的portal.properties文件中设置。可以看到在session_timeout.jsp页面中扩展session时间的代码:
Liferay.Session.init(
{
	autoExtend: <%= PropsValues.SESSION_TIMEOUT_AUTO_EXTEND %>,
	timeout: <%= sessionTimeout %>,
	timeoutWarning: <%= sessionTimeoutWarning %>,
	redirectOnExpire: <%= PropsValues.SESSION_TIMEOUT_REDIRECT_ON_EXPIRE %>
}
);

这样我们在每一次ajax请求处理以后都添加一段扩展session时间的代码,就可以解决开始时提到的session超时问题。你可以这样添加:
if (Liferay.Session._stateCheck) {
	window.clearTimeout(Liferay.Session._stateCheck);
	Liferay.Session._stateCheck = null;
}
Liferay.Session.init({autoExtend:false, timeout:Liferay.Session._timeout, timeoutWarning:Liferay.Session._warning});

先清空原有的session计时器,之后重启Liferay的session计时。

但是这肯定不是好方法,你需要在每一个用到ajax技术的地方添加一段这样的代码或js方法;同时对一些特殊情况也不容易处理,比如你使用ajax技术异步启动一个服务器端的任务处理线程,一般情况下你可以进行其他操作,一段时间以后来查看线程任务是否执行完成。但是如果你一直停留在这个页面等待任务执行完成,session设置的时间是30分钟,你的任务执行了31分钟,你还没有看到执行结果就得重新登录,这种情况下就添加必要的特殊处理。

如果你也在使用Liferay,对这个问题有更好的处理方法,欢迎回复讨论!
4
1
分享到:
评论

相关推荐

    基于serverResource方式的liferay中ajax方式的的实现

    通过上述步骤,我们可以实现基于serverResource的Ajax请求,在Liferay中创建动态、交互的Web应用。同时,阅读提供的"JSR268详解.docx"文档可以帮助你更好地理解JSR268(Portlet 2.0 API)在Liferay中的应用,它与...

    Liferay ajax

    在Liferay 6中,使用Ajax技术来处理Portlet请求是一种常见的优化用户交互的方法。Ajax(Asynchronous JavaScript and XML)允许部分页面更新,无需整个门户页面的刷新,从而提升了用户体验,尤其是在Portlet环境下。...

    liferay中应用Struts例子

    该文档是在Liferay5.1.2中应用struts的示例,使用时只要现创建一个portlet,然后解压缩并利用该文档中相同的部分将其覆盖,然后build,deploy后,即可看到其结果,安装使用都及其方便。

    liferay 6.2开发指南+用户手册

    Portlets是Liferay中的应用程序单元,可以是动态网页、数据表或者交互式表单。6.2版支持JSR-286标准,开发者可以使用Java、FreeMarker、Velocity或JSP来编写portlet代码。 4. **主题与布局** Liferay允许定制主题...

    利用Liferay开发portal应用(插件)

    在IT行业中,Liferay是一款广泛使用的开源企业级Portal框架,它允许开发者构建高度可定制的企业级应用程序。本主题聚焦于如何利用Liferay开发portal应用,特别是通过插件的方式来实现。以下将详细介绍Liferay插件...

    Liferay porta 清理不需要的Portlet 代码

    在Liferay Portal中,Portlet是可重用的Web组件,用于展示动态内容和服务。随着时间的推移,项目中可能会积累许多不再使用的Portlet代码,这不仅会占用服务器资源,还可能影响系统的性能和维护效率。因此,定期清理...

    liferay development 中文

    2. **Portlet开发**:Portlet是Liferay中的基本展示单元,类似于Web应用中的MVC组件。开发者需要掌握如何创建、配置和部署Portlet,包括MVCPortlet、JSR286 Portlet和Freemarker或JSP模板的使用。 3. **服务构建器...

    liferay的开发文档

    Portlets是Liferay中的核心组件,可以视为网页上的小型应用。通过学习这份文档,开发者能够理解portlet生命周期、渲染机制以及如何利用MVC Portlet模式进行开发。此外,文档还涵盖了portlet与Liferay服务的集成,如...

    Liferay 6 入门教程

    在Liferay 6中,开发工作主要围绕Portlets进行,Portlets是Liferay中的应用程序单元,它们可以嵌入到门户页面上提供特定的功能。"plugins开发指南2-开发一个简单的portlet.pdf"将引导初学者了解如何创建并部署基本的...

    Liferay5.2.3和CAS配置成SSO

    完成上述步骤后,你将拥有一个使用Liferay 5.2.3和CAS 3.0.5实现的SSO系统,用户可以无缝地在不同应用之间切换,而只需登录一次。这个配置对于多应用的企业环境特别有用,可以提高用户体验,同时简化身份验证管理。

    CAS4.2.4 连接Liferay6.2以上版本数据库用户表验证用户 project

    在这个项目中,我们将探讨如何使用CAS 4.2.4版本与Liferay 6.2及以上版本的数据库集成,以便在用户登录时通过验证Liferay的用户表来确认用户身份。 Liferay是一款开源的企业级门户平台,提供内容管理、社交网络和...

    Liferay的CAS SSO实现

    在实际应用中,Liferay的SSO功能可能还需要与其他身份管理解决方案,如LDAP(轻量级目录访问协议)或Active Directory集成,以利用已有的用户数据库。这些集成通常涉及到配置Liferay的用户目录服务,确保它们能够与...

    LIferay6开发书籍

    其次,《Liferay 用户开发接口》深入解析了Liferay中的用户管理和权限控制机制。这包括用户账户的创建、管理,角色和组的设定,以及基于角色的访问控制(RBAC)。开发者将了解到如何定制用户界面,实现个性化用户...

    liferay跨组件间通信实例

    `test-portlet`可以利用布局上下文将数据存储在session中,其他portlet可以通过读取该session来访问这些数据。 6. **门户上下文(Portal Context)**:Liferay提供了一个全局的门户上下文,允许所有portlet访问门户...

    liferay

    - **Session 对象**:管理用户的会话信息。 - **Preference 对象**:存储 Portlet 的个性化设置。 ##### 3.4 编写自己的 Portlet 类 - **开发环境**:确保开发环境已经准备好,包括安装 JDK、Tomcat 或其他应用...

    在liferay中整合GWT,附例子

    在Liferay中整合GWT(Google Web Toolkit)是一项常见的任务,尤其对于开发复杂的企业级Web应用来说,这种集成可以利用GWT的强大力量来创建高性能的用户界面,同时利用Liferay的门户功能和社区特性。这篇博文提供了...

Global site tag (gtag.js) - Google Analytics