XML命名空间详解

http://happylongnv.blog.hexun.com/48859954_d.html

目的:解决同一个元素在相同文件中代表不同含义的问题。因为XML文档中使用的元素不是固定的,那么两个不同的XML文档使用同一个名字来描述不同类型的元素的情况就可能发生。而这种情况又往往会导致命名冲突。

语法规范:直接定义方式和缺省定义方式:

直接定义方式:xmlns:[命名空间前缀]=[命名空间名]

缺省定义方式:xmlns=[命名空间名]

命名空间声明中,等号右边的属性值部分是一个URI(Uniform Resource Identifier统一资源标识符)引用,其功能是区分不同的命名空间。因此,这个URI引用被称为命名空间名,它应该具有唯一性和持久性。虽然该属性值使用了URI,但其目的并不是要直接得到一个schema或DTD,主要的目的在于标识特定的命名空间。

命名空间声明中,等号左边的属性名部分,如果有用冒号":"分隔开的"命名空间前缀",就是直接定义方式,其中"命名空间前缀"是一个合法的XML名称。没有"命名空间前缀"的命名空间声明,就是缺省的命名空间声明。

命名空间声明将"命名空间名"与"命名空间前缀"绑定在一起。

例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明在xml中使用Spring Security提供的命名空间 -->
<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">

    <!-- http部分配置如何拦截用户请求。auto-config='true'将自动配置几种常用的权限控制机制,包括form, anonymous, 
        rememberMe -->
    <http auto-config='true'>
        <!-- 让没登陆的用户也可以访问login.jsp。这是因为配置文件中的“/**”配置,要求用户访问任意一个系统资源时,必须拥有ROLE_USER角色,/login.jsp也不例外,如果我们不为/login.jsp单独配置访问权限,会造成用户连登陆的权限都没有,这是不正确的 -->
        <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <!-- 我们利用intercept-url来判断用户需要具有何种权限才能访问对应的url资源, 可以在pattern中指定一个特定的url资源,也可以使用通配符指定一组类似的url资源。 
            例子中定义的两个intercepter-url,第一个用来控制对/admin.jsp的访问,第二个使用了通配符/**,说明它将控制对系统中所有url资源的访问。在实际使用中,Spring 
            Security采用的是一种就近原则,就是说当用户访问的url资源满足多个intercepter-url时,系统将使用第一个符合条件的intercept-url进行权限控制。在我们这个例子中就是,当用户访问/admin.jsp时,虽然两个intercept-url都满足要求,但因为第一个intercept-url排在上面,所以Spring 
            Security会使用第一个intercept-url中的配置处理对/admin.jsp的请求,也就是说,只有那些拥有了ROLE_ADMIN权限的用户才能访问/admin.jsp。 
            access指定的权限部分比较有趣,大家可以注意到这些权限标示符都是以ROLE_开头的,实际上这与Spring Security中的Voter机制有着千丝万缕的联系,只有包含了特定前缀的字符串才会被Spring 
            Security处理。目前来说我们只需要记住这一点就可以了,在教程以后的部分中我们会详细讲解Voter的内容 -->
        <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
        <intercept-url pattern="/**" access="ROLE_USER" />
        <!-- login-page表示用户登陆时显示我们自定义的login.jsp。 这时我们访问系统显示的登陆页面将是我们上面创建的login.jsp -->
        <!-- authentication-failure-url表示用户登陆失败时,跳转到哪个页面。 当用户输入的登录名和密码不正确时,系统将再次跳转到/login.jsp,并添加一个error=true参数作为登陆失败的标示。 -->
        <form-login login-page="/login.jsp"
            authentication-failure-url="/login.jsp?error=true"
            default-target-url="/" />
        <!-- default-target-url表示登陆成功时,跳转到哪个页面 -->
    </http>

    <!-- users-by-username-query为根据用户名查找用户,系统通过传入的用户名查询当前用户的登录名,密码和是否被禁用这一状态。authorities-by-username-query为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限 -->
    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"
                users-by-username-query="select username,password,status as enabled
                                         from user
                                        where username=?"
                authorities-by-username-query="select u.username,r.name as authority
                                             from user u
                                             join user_role ur
                                               on u.id=ur.user_id
                                             join role r
                                               on r.id=ur.role_id
                                            where u.username=?" />
        </authentication-provider>
    </authentication-manager>

    <b:bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="locations">
            <b:list>
                <b:value>classpath*:application.properties</b:value>
            </b:list>
        </b:property>
    </b:bean>
    <!-- 数据源配置, 使用DBCP数据库连接池 -->
    <b:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <!-- Connection Info -->
        <b:property name="driverClassName" value="${jdbc.driver}" />
        <b:property name="url" value="${jdbc.url}" />
        <b:property name="username" value="${jdbc.username}" />
        <b:property name="password" value="${jdbc.password}" />

        <!-- Connection Pooling Info -->
        <b:property name="maxActive" value="${dbcp.maxActive}" />
        <b:property name="maxIdle" value="${dbcp.maxIdle}" />
        <b:property name="defaultAutoCommit" value="false" />
        <!-- 连接Idle一个小时后超时 -->
        <b:property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <b:property name="minEvictableIdleTimeMillis" value="3600000" />
    </b:bean>
</b:beans>
posted @ 2014-05-12 19:05  humeng126  阅读(870)  评论(0编辑  收藏  举报