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>