`
gongmingwind
  • 浏览: 588618 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

(转)EXT结合acegi解决ajax提交时session失效的问题

    博客分类:
  • Ext
阅读更多
背景

  B/S系统中,客户端向服务器端提交的http请求,可以分为两种:非ajax请求(一般http请求)和ajax请求。Acegi是通过一系列的filter实现的安全框架(现在好像升级成spring sceurity了)。对于非ajax请求时的session失效,acegi已经完成,即如果session失效则自动跳转到登录页面。

解决方案

  Acegi对于session失效(或其他web异常)的处理是通过“org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint”类来实现的,具体配置如下:
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint">
            <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
                <property name="loginFormUrl" value="/login.jsp"/>
                <property name="forceHttps" value="false"/>
            </bean>
        </property>
 </bean>


如代码所示,acegi检测到session失效时就跳转到登录页面“/login.jsp”。实际上不管是非ajax请求还是ajax请求,acegi都是这么处理的。不过因为ajax不能实现页面跳转,所以这时的session失效处理的办法就“失效”了,客户在提交ajax后会得不到正确的处理或提示。解决这个问题的关键在于把两种http请求区分开来。本人对http的原理了解不深,笨人用笨办法,请出Ext(封装了ajax的一个js框架,其他js框架按照同样的原理理论上也可以实现)来:
Ext.Ajax.on('beforerequest', function(){
   Ext.Ajax.extraParams={'ajax_extraParams':'true'};
 }, this);//


如以上代码所示,EXT在ajax提交前和处理完成后提供了事件接口,分别是“'beforerequest'”和“'requestcomplete'”,我们就在这两个事件上想办法。对所有的ajax请求,我们都加上一个特殊的参数用以与非ajax请求区分“Ext.Ajax.extraParams={'ajax_extraParams':'true'};”。除此之外,我们还需acegi的辅助,修改它处理session失效时的几个参数配置:

<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint">
            <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
                <property name="loginFormUrl" value="/checkLogin.jsp"/>
                <property name="forceHttps" value="false"/>
                <property name="serverSideRedirect" value="true"/>
            </bean>
        </property>
 </bean>


与前面提到的acegi配置相比,修改了两个地方:"loginFormUrl"修改成"/checkLogin.jsp",即检测到失效后跳转的路径;增加了一个"serverSideRedirect"属性并将其配置成true,即采用“forward”方式跳转(false则才用“redirect”方式跳转),之所以要采用“forward”方式是因为我们需要获取前面由EXT提交过来用以检测ajax请求的参数“ajax_extraParams”。

这样跳转到“checkLogin.jsp”后,我们就可以根据是否ajax请求作出我们自己的处理了:

<%
  String extraParams=request.getParameter("ajax_extraParams");
  System.out.println("extraParams:"+extraParams);
  if("true".equals(extraParams)){
	  out.print("{ajax_session_invalid:true}");
	  return;
  }
  String contextPath = request.getContextPath();
  response.sendRedirect(contextPath+"/login.jsp");
%>

代码里面读取“ajax_extraParams”参数,如果没有此参数,则直接跳转到登录页面;如有且为“true”我们就认为是ajax请求,则把session失效的标记以json的方式写会客户端,最后由EXT来处理:
Ext.Ajax.on('requestcomplete', function(conn,response){
	try{
	  var resp=Ext.decode(response.responseText);
	  if(resp.ajax_session_invalid){
	  	alert("请重新登陆!")
	  	location=g_rootPath+"login.jsp";
	  }
	}catch(e){	}
}, this);


以上代码即EXT在ajax完成事件通过“ajax_session_invalid”属性来检测是否session失效,如果失效则提示用户,然后跳转到登录界面。



后记

   整个解决方案里面需要注意两个地方:acegi的"serverSideRedirect"属性必须是“1.0.3”及其以后的版本才有;另外一个就是我们的两个参数名(ajax_extraParams和ajax_session_invalid)必须比较特殊,以与业务属性区分。


转自:http://javaphoon.iteye.com/blog/375043
分享到:
评论

相关推荐

    用ssh+acegi+ajax开发的网上在线人才招聘系统

    用ssh+acegi+ajax开发的网上在线人才招聘系统,可以用在各个企业或单位中进行人才招聘管理,同时此系统可以进行在线考试,如果下载后不会运行,可以在线联系我 qq:642706101

    Acegi解决权限问题

    在本文中,我们将深入探讨Acegi如何解决权限问题,并通过分析提供的代码、文档和配置文件,来理解其实现机制。 首先,Acegi的核心功能是提供细粒度的访问控制,允许开发者对应用中的资源(如URL、方法、对象等)...

    SSH + ajax + acegi

    SSH + AJAX + Acegi 是一个基于Java技术栈的Web应用开发框架组合,广泛应用于企业级应用的构建。SSH指的是Spring、Struts和Hibernate三个开源框架的首字母缩写,而Acegi则是Spring Security的前身,负责处理应用的...

    acegi

    - **会话管理(Session Management)**: Acegi 可以监控和管理用户的会话,防止会话劫持、会话固定等安全问题。 - **过滤器链(Filter Chain)**:Acegi 使用过滤器链来拦截请求,执行安全检查,这是其实现安全...

    基于java的ACEGI

    3. **会话管理(Session Management)**:Acegi可以监控和管理用户的会话,防止会话固定攻击(Session Fixation)和会话超时。它还支持多因素认证,如结合硬件令牌增强安全性。 4. **过滤器链(Filter Chain)**:...

    使用acegi控制用户权限实例

    尽管Acegi Security是Spring早期的安全解决方案,但它提供了一套全面的工具,对于理解Spring Security(Acegi的现代替代品)的工作原理非常有帮助。在实际项目中,现在通常推荐使用Spring Security,因为它拥有更...

    acegi 完整实例

    5. **缓存**:Acegi可以集成缓存机制,如 EhCache 或者其他的缓存解决方案,以提高性能,减少对数据库的频繁访问。例如,它可能缓存已验证的用户信息,避免每次请求都进行数据库查询。 6. **Session有效时间**:...

    ACEGI

    Acegi Security是一个专门为Spring框架设计的权限控制框架,旨在为基于J2EE的企业级应用程序提供全面的安全服务。...因此,Acegi Security成为了许多Spring开发者在实现应用程序安全控制时的首选框架。

    acegi使用说明acegi原理及如何与spring、hibernate结合

    Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全...

    Acegi例子代码+一个很好的学习Acegi的网址

    3. **会话管理(Session Management)**:Acegi提供了会话管理功能,可以防止会话固定攻击(Session Fixation),并支持会话超时和并发会话控制。 4. **过滤器安全链(Filter Security Interceptor)**:Acegi的...

    Acegi框架介绍 acegi安全与认证

    尽管现在Spring Security已经成为更推荐的安全解决方案,但Acegi在早期对Spring应用的安全支持起到了重要作用,其设计理念和实现方式在Spring Security中得到了继承和发展。 总的来说,Acegi Security(Spring ...

    Acegi学习笔记(JAVA系统安全编程时用到)

    Acegi 是一个强大的 Java 安全框架,专用于系统安全编程,尤其在处理认证和授权方面表现出色。在本文中,我们将深入探讨 Acegi 的基本...无论是处理简单的认证还是复杂的授权需求,Acegi 都能提供一套完整的解决方案。

    acegi结合ssh实用列子

    Acegi Security System for Spring(简称Acegi)是Spring框架的一个扩展,它为Spring应用程序提供了全面的安全管理解决方案。...同时,不断学习和理解Acegi的原理,有助于更好地解决实际开发中的安全问题。

    springside 玩转acegi

    标题 "springside 玩转acegi" 涉及到的是SpringSide项目中对Acegi安全框架的使用,Acegi是Spring早期的一个安全模块,后来被Spring Security所取代。Acegi提供了一套全面的Java安全解决方案,包括认证、授权、会话...

    Spring Acegi权限控制

    Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两个核心的安全问题。 首先,让我们理解认证和授权的基本概念: - **认证**...

    spring acegi 详细文档

    如果你手头有Acegi的详细文档,如acegi.docx和Acegi.zip中的内容,这将是一个宝贵的资源,帮助你深入理解和解决问题。 总结起来,Spring Acegi是一个强大的安全框架,它的功能包括用户认证、权限控制和安全拦截。...

    acegisecurity-1.0.7

    《Acegi Security 1.0.7:Spring框架的安全认证组件深度解析》 Acegi Security是Spring框架的一个扩展,专为Java企业级应用提供安全认证和授权服务。它在Spring框架的基础上构建了一套完整的安全解决方案,使开发者...

    acegi的使用

    它不仅适用于 Web 应用的保护,还能在服务层面上确保方法调用的安全性,这使得 Acegi 成为一个灵活且全面的安全解决方案,适合于各种基于 Spring 的企业级应用。通过使用 Acegi,开发者可以专注于业务逻辑,而无需...

Global site tag (gtag.js) - Google Analytics