由于ExtJS项目,在页面发送请求都是以Ajax这种形式的异步请求,所以当后台检测到session过期时,不能通过转发使客户端跳转到login页面。
http://jayklin.iteye.com/blog/1039132
在web.xml配置的Filter、Servlet等都是按照顺序拦截的,项目使用Spring Security作为用户登陆权限管理,所以所有正常操作的过滤器,必须配置在Security过滤器之后。
项目实现思路,在Security过滤器之前加入两个过滤器,一个是Struts2过滤器,但这个过滤器只对一个指定请求起作用,如处理session过期的action请求。令一个是实现Filter接口的自定义过滤器,实现对当前请求session状态的检测,如发现session已经过期,通过sendRedirect把请求转发给前面那个指定的Struts2过滤器,之后经过自定义的全局拦截器(继承AbstractInterceptor),向客户端发送session过期的信息。通过js检测,如果session过期后跳转页面到登陆界面。
具体实现代码:首先是定义检查session状态的Filter,这里使用Spring Security实现用户验证,这样的session当没有过期时可以通过属性名字“SPRING_SECURITY_CONTEXT”获得SecurityContext实例,如
public class SessionTimeoutFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest)request;
HttpServletResponse servletResponse = (HttpServletResponse)response;
HttpSession session = servletRequest.getSession();
String url = servletRequest.getRequestURI();
String path = url.substring(url.lastIndexOf("/"));
String[] s = path.split("_");
if (url.indexOf(".")==-1 && s.length == 2) {
SecurityContext securityContext = (SecurityContext)session.getAttribute("SPRING_SECURITY_CONTEXT");
if (securityContext == null) {
servletResponse.sendRedirect(servletRequest.getContextPath()+"/test_timeout");
}else {
chain.doFilter(request, response);
}
}else {
chain.doFilter(request, response);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
因为该Filter在web.xml中配置url-pattern通配符为“/*”,这样所有请求都会经过该Filter,但这里这需要检验ExtJS发出的"**_**"这样格式的Ajax请求,所以需要首先判断请求是否为Ajax请求;当securityContext == null时,说明session已经过期,这时跳转到test_timeout。
在web.xml中,在上面这个Filter之前加入一个url-pattern通配符为“test_timeout”的Struts过滤器,如web.xml:
<filter>
<filter-name>strutsForSessionTimeout</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>strutsForSessionTimeout</filter-name>
<url-pattern>/test_timeout</url-pattern>
</filter-mapping>
<filter>
<filter-name>SessionTimeoutFilter</filter-name>
<filter-class>com.edward.SessionTimeoutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionTimeoutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
需要在session已过期的action请求响应前,向客户端发送session过期的信息,必须在Struts.xml文件中配置自定义的Interceptor,详情见:
http://jayklin.iteye.com/blog/1039145
到目前为止,已经实现了后台检测session状态,之后在action响应之前向客户端发送session已经过期的信息,那么需要在ExtJS中获取这个信息,实现页面跳转。在ExtJS中有两种请求:一为Ext.Ajax.request,另一个为Ext.form.Action.submit。但是经过我的测试,这两种请求在请求完成之后都会触发Ext.Ajax的“requestcomplete”事件,那么就可以在这里做出判断,如:
//session timeout
Ext.Ajax.on('requestcomplete', function(conn, response, options, e){
var s = response.responseText;
if(s.indexOf("{timeout:",0) != -1){
// window.location.reload();
window.location.href = "login.jsp?timeout=true";
}
});
分享到:
相关推荐
最近自己动手做了一个后台使用...工程实现的功能很简单,就是用户登陆后,可以将笔记内容记录到系统里。后续可以通过日期或者内容进行查询和修改。 主要的练习点在 1 SSH框架的搭建和使用; 2 extjs组件化创建。
SSH+ExtJS框架是Web应用开发中的一个常见组合,它结合了Struts2、Hibernate和Spring三大主流Java EE框架,并引入了ExtJS作为前端展示层技术。这个框架的使用大大提高了开发效率,提供了灵活的数据管理和用户界面交互...
在SSH整合中,Hibernate负责将业务对象映射到数据库表,通过Session接口进行增删查改操作。使用Hibernate,开发者可以专注于业务逻辑,而不是数据库操作细节。 EXTJS4是一个强大的前端JavaScript库,专用于构建具有...
在IT领域,SSH和ExtJS是两种常用的开发技术。SSH是指Spring、Struts和Hibernate三个开源框架的组合,常用于构建企业级Java Web应用。而ExtJS是一个强大的JavaScript库,用于构建用户界面,特别是数据驱动的富客户端...
SSH+EXTJS是一种常见的Web开发框架组合,其中SSH代表Struts2、Hibernate和Spring,而EXTJS是一个前端JavaScript框架。这个“ssh+extjs全注解的上传、分页、验证码的demo”提供了如何在SSH后端框架基础上,结合EXTJS...
在"ssh+extjs+mysql整合"中,我们将SSH框架与ExtJS前端技术和MySQL数据库结合起来,构建一个完整的Web应用。以下是对这个整合过程的详细说明: 1. **Spring**:Spring作为核心框架,负责管理应用程序的各个组件,...
struts2+spring+hibernate整合(ssh+extjs整合)小项目“VIP消费查询系统”源码(源码+系统设计文档+建表语句+所有jar包)。该项目包含以下功能: 登录:本系统为商场VIP消费情况查询系统,具有一定的保密性。因此必须...
本demo完全实现了SSH和ExtJS的集成,提供了从前端用户界面到后端数据处理的完整解决方案。 **Spring框架**是核心的依赖注入(DI)和面向切面编程(AOP)框架,负责管理应用中的对象和组件。在本demo中,Spring可能...
SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统SSH+EXTJS页面图书管理系统
SSH+Extjs开发视频教程-基于SSH+Maven+Extjs4+MySQL技术实战开发CRM客.doc
在这个项目中,SSH用于后端业务逻辑处理和数据管理,而ExtJS则负责构建富客户端界面,Spring的定时任务模块(Spring Task)用于实现后台定时执行的任务。 首先,SSH(Spring、Struts2、Hibernate)是经典的Java EE...
SSH+ExtJS项目中的jar包是Java开发中的关键组件,它们包含了实现特定功能的类库。SSH是指Spring、Struts和Hibernate三个开源框架的组合,而ExtJS则是一个用于构建富客户端Web应用的JavaScript框架。这里我们将深入...
标题中的“ssh+extjs4小项目”指的是一个基于SSH框架和ExtJS 4的轻量级Web应用程序。SSH是Spring、Struts2和Hibernate三个开源框架的组合,它们在Java Web开发中广泛使用,提供了模型-视图-控制器(MVC)架构的支持...
SSH+EXTJS4 的一个模块实现,使用的是mysql数据库,sql文件在文件夹里面
当SSH与ExtJS结合时,可以创建出交互性极强、用户体验优秀的Web应用。 在“采用ssh+Extjs3.0实例框架luogou项目”中,我们主要探讨以下几个关键知识点: 1. **Spring框架**:作为基础架构层,Spring提供了依赖注入...
SSH+Extjs Oa管理系统整合是一项复杂而关键的IT任务,涉及到多个技术栈的集成,主要包括Struts、Spring和Hibernate这三个Java EE框架,以及Extjs前端框架。在这样的系统中,SSH负责后端业务逻辑处理和数据管理,而...
【SSH+EXTJS+JSON】组合是开发Web应用程序的一种常见技术栈。SSH指的是Spring、Struts2和Hibernate三个开源框架的首字母缩写,EXTJS则是一个JavaScript库,用于构建富客户端应用程序,而JSON(JavaScript Object ...
标题“SSH+ExtJS.rar”所指的,是将两种技术——Secure Shell (SSH) 和 Extensible JavaScript (ExtJS) 结合使用的项目压缩包。这个压缩包可能包含了一个使用SSH和ExtJS构建的Web应用程序的源代码和其他相关资源。 ...
这个项目结合了后端强大的SSH框架和EXTJS的丰富交互界面,旨在提供一个高效、易用的企业级管理平台。 SSH框架详解: 1. Struts2:这是一个基于MVC设计模式的Web应用框架,它简化了开发过程,通过Action和Result来...
ssh + extjs 4登录的小例子(前后台代码)