`

Acegi里一个很奇怪的方法调用

阅读更多

看Acegi源码时,发现这么一段有些奇怪的代码.

 protected Filter[] obtainAllDefinedFilters() {
        Iterator cads = this.filterInvocationDefinitionSource.getConfigAttributeDefinitions();
        Set list = new LinkedHashSet();

        while (cads.hasNext()) {
            ConfigAttributeDefinition attribDef = (ConfigAttributeDefinition) cads.next();
            Filter[] filters = obtainAllDefinedFilters(attribDef);

            for (int i = 0; i < filters.length; i++) {
                list.add(filters[i]);
            }
        }

        return (Filter[]) list.toArray(new Filter[0]);
 }

红色的代码为什么不直写成: return obtainAllDefinedFilters(attribDef);呢? 毕竟 obtainAllDefinedFilters本身就是返回一个Filter数组,为什么那个方法里还有再重复的加到一个List中,再把list转为数组呢? 

是Acegi开发小组粗心的过?还是有意为之?

 

下面是红色代码调用的那个方法:

 

private Filter[] obtainAllDefinedFilters(ConfigAttributeDefinition configAttributeDefinition) {
        List list = new Vector();
        Iterator attributes = configAttributeDefinition.getConfigAttributes();

        while (attributes.hasNext()) {
            ConfigAttribute attr = (ConfigAttribute) attributes.next();
            String filterName = attr.getAttribute();

            if (filterName == null) {
                throw new IllegalArgumentException("Configuration attribute: '" + attr
                    + "' returned null to the getAttribute() method, which is invalid when used with FilterChainProxy");
            }

            if (!filterName.equals(TOKEN_NONE)) {
                list.add(this.applicationContext.getBean(filterName, Filter.class));
            }
        }

        return (Filter[]) list.toArray(new Filter[list.size()]);
    }

2
3
分享到:
评论
3 楼 SINCE1978 2009-06-01  
看得很细,其实obtainAllDefinedFilters()这个方法不必看,因为它仅仅由FilterChainProxy的init和destroy所调用,acegi的推荐方式是FilterChainProxy由ioc容器托管而非servlet容器,所以这三个方法几乎不会被调用到。除非你需要集成第三方,而且你没有第三方的源码。
2 楼 rmn190 2008-10-07  
有道理, 我被它Set list = new LinkedHashSet(); 这一行里的起名方式给迷惑了.

谢谢!
1 楼 guoping007 2008-10-06  
一个是:List list = new Vector();一个是 Set list = new LinkedHashSet();
是不是为了过滤重复元素啊!?
而且这段代码
while (cads.hasNext()) {
            ConfigAttributeDefinition attribDef = (ConfigAttributeDefinition) cads.next();
            Filter[] filters = obtainAllDefinedFilters(attribDef); 

            for (int i = 0; i < filters.length; i++) {
                list.add(filters[i]);
            }
        }

因该是需要循环找到所有cads对应的filter把,为了避免多个cads对应的filter存在重复,所以用set。。
所以更不能直接使用 return obtainAllDefinedFilters(attribDef)把,这样不就只返回一个cads对应的filter了么??
貌似以前我也写过类似的代码。。。。

相关推荐

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

    Acegi是Spring Security的前身,它是一个用于Java企业级应用的安全框架,提供了全面的身份验证、授权和会话管理功能。这个压缩包包含了Acegi的示例代码和一个学习资源,对于初学者来说是非常宝贵的资料。 首先,让...

    acegi

    - AOP在Acegi中用于实现安全拦截,通过定义安全拦截器,可以在方法调用前、后或异常时执行特定的安全操作,比如权限检查。 5. **迁移至Spring Security** - 随着Spring框架的发展,Spring Security成为Acegi的...

    Acegi框架介绍 acegi安全与认证

    Acegi Security,现称为Spring Security,是一个强大的安全框架,主要用于基于Spring的企业级应用。它通过Spring的依赖注入(IoC)和面向切面编程(AOP)功能,提供了声明式的安全访问控制。Acegi能够实现精细的权限...

    ACEGI

    Acegi Security是一个专门为Spring框架设计的权限控制框架,旨在为基于J2EE的企业级应用程序提供全面的安全服务。这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境...

    Acegi-spring安全框架

    Acegi-Spring安全框架是一个专为基于Spring的企业应用设计的安全框架,现在被称为Spring Security。它提供了声明式的安全访问控制,允许开发者在Spring容器中配置安全相关的Bean,利用Spring的依赖注入(IoC)和面向...

    spring Acegi例子,很简单的一个acegi实例,容易理解

    Spring Acegi是一个安全框架,它为Spring应用提供了全面的安全管理解决方案。这个例子是为初学者设计的,旨在帮助他们快速理解和应用Acegi框架。Acegi(现在已被Spring Security替代)在Spring应用程序中提供了身份...

    acegi的使用

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

    spring acegi 详细文档

    Spring Acegi是一个安全框架,它为Spring应用提供了一套强大的身份验证和授权机制。这个框架在Spring Security(之前称为Spring Security)之前被广泛使用。在本文中,我们将深入探讨Spring Acegi的核心概念、功能和...

    Acegi详细教程

    Acegi安全系统是一个高度集成化的安全框架,专为基于Spring的应用系统设计。它通过提供一系列可在Spring应用上下文中配置的Bean来支持依赖注入和面向切面编程。Acegi不仅能够保护Web应用系统,还能在更低层次上对...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

    Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...

    基于java的ACEGI

    AceGI,全称为Acegi Security,是Java领域中一个用于Spring框架的安全组件,它提供了全面的身份验证、授权和会话管理功能。这个框架在早期的Spring版本中非常流行,为开发者构建安全的Web应用程序提供了强大的支持。...

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

    Acegi 是一个强大的 Java 安全框架,专用于系统安全编程,尤其在处理认证和授权方面表现出色。在本文中,我们将深入探讨 Acegi 的基本概念、如何设置以及它如何与 Spring 框架集成。 首先,让我们了解 Acegi 的核心...

    Acegi使用.pdf

    5. **RunAsManager**:在执行某些操作时,可以有选择性地替换当前的Authentication对象,以实现“作为”另一个用户运行代码的能力。 6. **SecureObject拦截器**:协调AuthenticationManager、AccessDecisionManager...

    Acegi安全系统介绍.doc

    - **接口定义:**`org.acegisecurity.AuthenticationManager`定义了一个名为`authenticate(Authentication authentication)`的方法,该方法接收一个`Authentication`对象作为参数,并尝试验证用户身份。 ##### 3. ...

    acegi保护业务方法_basedDatabase

    这些注解指定需要的角色或权限,Acegi Security会在方法调用前进行权限检查。 6. **URL安全控制**:除了保护业务方法,Acegi Security还可以用于控制URL级别的访问。通过`http`元素配置,可以设置URL访问规则,如...

    权限Acegi的使用

    Acegi Security,现已被Spring Security所取代,是Java EE应用程序中的一个强大且灵活的权限管理框架。它提供了全面的身份验证、授权和访问控制功能,旨在确保企业级应用的安全性。Acegi通过AOP(面向切面编程)的...

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

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

    spring acegi 使用工程demo

    Spring Acegi是一个安全框架,它为Spring应用提供了全面的安全管理功能。这个"spring acegi 使用工程demo"显然是一个示例项目,旨在帮助开发者理解和实践如何在Spring应用中集成和使用Acegi安全框架。 首先,Acegi...

    Spring Acegi权限控制

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

Global site tag (gtag.js) - Google Analytics