心随风动

就像被PS过的照片,浮在表面的漂亮而已。
主页 | Next page »
星期三 九月 03, 2008

Subversion之路---实现精细的目录访问权限控制

 

Subversion之路-----实现精细的目录访问权限控制<转>
原文:http://swjr.blog.com.cn/archives/2006/TheRoadToSubversion1authz.shtml

目 录

1   前言
1.1   Subversion 权限简介
1.2   其他信息
2   致谢
3   实战
3.1   背景假设
3.2   使用 svnserve.exe 作为 Subversion 服务器
3.2.1   启动 Subversion 服务
3.2.2   建立代码库
3.2.3   编辑代码库基础配置文件
3.2.4   管理用户帐号
3.2.5   建立目录访问权限控制文件
3.2.6   导入代码
3.2.7   测试
4   深入
4.1   svnserve.conf
4.2   authz.conf 之用户分组
4.3   authz.conf 之项目根目录
4.4   authz.conf 之项目子目录
4.5   authz.conf 之目录表示法
4.6   authz.conf 的其他注意点
5   改进
5.1   对中文目录的支持
6   参考文献
7   历史轨迹

1   前言
1.1   Subversion 权限简介在 Subversion 的使用当中,存在“认证”、“授权”两个概念。认证,即 authentication,是指用户名与密码的认证。授权,即 authorization ,是指某用户对某个目录是否具备读、写权限的一种审核。这两者配合作用,就组成了 Subversion 的整个帐户管理体系。

在实际的工作当中,我们有时候会遇见需要控制项目目录的访问权限的情况,比如说对项目的一些关键模块进行限制,仅允许少数授权人士才可以修改等。由于项目的目录本身就是作为版本库的一个部分被 Subversion 所收管,所以我们无法利用操作系统的帐户权限体系,来实现授权控制。因此,这个问题就只有让svn自己来解决了。

Subversion 提供了面向目录的帐户权限管理功能,通过它,我们就可以很精确地实现项目目录的访问控制。不过在 1.2 及其以前的版本,我们只能利用 mod_authz_svn.so 模块,结合 Apache 服务器来实现目录访问控制,这对于对 Apache 的配置与使用不是很熟悉的人来说,就不是很方便了。而Subversion终于在 1.3 版本上,在 svnserve.exe 服务器里面添加了这一功能,方便了很多人。

1.2   其他信息本文面向那些 Subversion 的管理员,或者任何对 Subversoin 有兴趣的人们。本文假定读者对Subversion有一定的了解,因此不打算对所有涉及到的安装、使用,做一个细节性的描述。若对于文章中描述的其他细节方面有所疑问,请访问“参考文献”一节里面的参考资料。如果你对本文任何地方有什么意见,或者发现本文有着大大小小的错误,请联系 zhengxinxing <AT> gmail <DOT> com 。

本文是基于 Subversion 1.3.2、MS Windows 2003 Server Edition 平台来编写的,且 Subversion 服务器是利用 svnserve.exe 来架设的。不过,本文讲述到的绝大多数内容,都是不仅与操作系统平台无关,而且与是采用 svnserve(.exe) 还是使用 Apache 来作为 Subversion 服务器也基本无关。因此为免罗嗦,本文就以 svnserve(.exe) 为例进行描述,而略过 Apache 服务器相关的内容,有兴趣的读者可以参考其他文章来在 Apache 服务器下实现类似的功能。

本文是利用 reST 格式来编写的,如果你对它感兴趣,请访问 http://docutils.sourceforge.net/rst.html 。如果想要看到更好的html格式,你可以通篇复制本文到一个文本文件里,然后利用 docutils 的 rst2html.py 脚本编译它,当然,首先你必须安装 python。

本文的获得方式:

原始发布点: http://iusesvn.com/bbs/thread-6-1-1.html
完整源文件,请利用 svn 命令来获取,命令为 svn co svn://cvs.woodpecker.org.cn/woodpecker/zqlib/tangle/michael.zheng/road2svn
HTML版式文件,请访问 http://zhengxinxing.googlepages.com/The.Road.to.Subversion_authz.html (推荐)或 http://swjr.blog.com.cn/archives/2006/TheRoadToSubversion1authz.shtml 。
2   致谢非常感谢 iusesvn.com 站的站长 PCplayer ,他在本文编写过程中,给我提出了很多宝贵的意见与建议。

感谢 woodpecker.org.cn 提供的 Subversion 空间,让更多的人可以通过 svn 获得本文件。

感谢 google 公司提供的免费主页空间,让我可以放置完全定制的 HTML 文件。

3   实战本章先直接给出需求及其最终的结果,如果你觉得对配置有什么疑问,或者看不懂,请不要着急,我会在后面的章节详细描述的。

3.1   背景假设厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计、销售,并在北京、上海各设立了一个办事处。对于工作日志,原先采用邮件方式发给经理,但是这种方式有个缺点,那就是不具备连续性,要看以前的日志必须一封一封邮件去查看,很麻烦。于是就想到利用 Subversion, 让员工在自己电脑上编辑日志,然后利用svn传送回来,既方便员工自己编写日志,又方便对日志的归档处理,而且提交日志的时候只需要执行一下 svn commit 即可,比发送邮件还要简单的多。

svn服务器相关信息

服务器地址: 192.168.0.1
服务器OS: MS Windows 2000 Server Edition 中文版
用于存放日志的代码库本地目录: D:\svn\arm
arm部门文档的目录结构如下:

arm                 部门名称
├─diary           工作日志目录
│  ├─headquarters    总部工作日志目录
│  ├─beijing         北京办日志目录
│  └─shanghai        上海办日志目录
├─ref             公司公共文件参考目录
└─temp            临时文件目录

人员情况

morson,公司总经理,不习惯使用电脑,更喜欢传统的纸与笔,以及面对面的交流
michael,arm事业部的部门经理,没事的时候喜欢弄点儿新技术,用svn来管理日志,就是他想出来的主意
scofield,北京办人员,老员工,为人油滑难管
lincon,上海办人员,老员工,大老实人一个
linda,总部协调员、秘书,文笔不错,长得也不错
rory,单片机技术员,技术支持
访问权限需求分析

允许总经理、部门经理读取所有文件。顺便给他们开放写权限,以便体现对他们职位的尊重,虽然对于某些文件来说,他们若拥有“写”权限其实也没什么用处
除部门经理外,所有其他人员,均只能看到本办事处人员工作日志
不允许匿名访问
ref目录只允许经理和秘书读写,对其他人只读
temp目录人人都可以随意读写
3.2   使用 svnserve.exe 作为 Subversion 服务器本节描述如何利用 svnserve.exe 来作为代码库服务器端,实现上述功能。至于另外一种代码库服务器端,即利用 Apache 结合 mod_dav_svn.so 来实现的代码库服务器端,由于其对于本文叙述的内容“实现精细的目录访问权限控制”而言,与前者没有太大的区别,故而略过不提。它们二者只是在初次安装、配置方面存在一些不同,有兴趣的读者,可以参考其他文档,重新实验下述步骤。

3.2.1   启动 Subversion 服务
在服务器端,打开一个命令行窗口,用CD命令进入 Subversion 安装目录下的 bin 目录,运行如下指令:

svnserve -d -r d:\svn

其中的 -d 参数表示 svnserve.exe 将会作为一个服务程序运行在后台,而 -r 参数表示将 D:\svn 目录指定为代码库的根目录。这样,当客户端使用类似 svn://192.168.0.1/foo 这样内容的 URL 来访问服务器时候,其所访问到的真实代码库,其实就是 D:\svn\foo

用上述命令行方式启动的 svn 服务有个小缺点,就是在本试验过程中,服务器端必须要一直开着那个运行了上述命令的DOS窗口,不能关闭它。如果不想看到这个窗口,可以将 svnserve 安装成 windows 的一个 services,安装方式请参考其他文章。

3.2.2   建立代码库
在服务器端的 D:\svn 目录下,建立一个名为 arm 的代码库,命令如下:

D:\svn>svnadmin create arm

使用上述命令之后,如果不出问题的话,在 D:\svn 目录下就会多出一个叫做 arm 的目录,其下具备 conf、dav、hooks、locks、db 等子目录或文件,此即 一个名为arm的代码库 。从此,通过 svn://192.168.0.1/arm 这样的 URL,我们就可以对这个代码库进行访问了。接下来就要进入本文的正题了,也就是权限配置部分了。

其实进入 arm\conf 目录你就会发现,它下面已经存在三个写了一些帮助信息和示例的配置文件,以帮助用户尽早掌握其配置方法。这三个默认的配置文件分别是 svnserve.conf、passwd、authz 。其中后两者没有后缀,对于 windows 系统的用户来说,看起来总是有些怪异,所以在接下来的章节里面,我将它们两个都给添加了个 conf 后缀,以便管理。

3.2.3   编辑代码库基础配置文件
在服务器端,编辑代码库的 arm\conf\svnserve.conf 文件,如下:

[general]
password-db = passwd.conf
anon-access = none
auth-access = write
authz-db = authz.conf

3.2.4   管理用户帐号
在服务器端,新建 arm\conf\passwd.conf 文件,如下:

[users]
morson = ShowMeTheMoney
michael = mysecretpassword
scofield = hellolittilekiller
lincon = asyouknows111
rory = 8809117
linda = IlikeWorldCup2006

3.2.5   建立目录访问权限控制文件
在服务器端,新建 arm\conf\authz.conf 文件,内容如下:

[groups]
g_vip = morson
g_manager = michael
g_beijing = scofield
g_shanghai = lincon
g_headquarters = rory, linda
g_docs = linda
[arm:/]
@g_manager = rw
* = r
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
[arm:/diary/beijing]
@g_manager = rw
@g_beijing = rw
@g_vip = r
* =
[arm:/diary/shanghai]
@g_manager = rw
@g_shanghai = rw
@g_vip = r
* =
[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r
[arm:/temp]
* = rw

3.2.6   导入代码
在客户机 F:\temp 目录下,建立好前述“背景假设”一节中描述的目录结构,然后用命令 F:\temp>svn import arm svn://192.168.0.1/arm --username michael --password mysecretpassword 导入整个目录结构。

这条指令的精确意思是,将 arm 目录下面的所有东西,导入到那个名叫 arm 的代码库中去。如果你不指定源目录,则 svn 会默认将当前目录作为源目录。比如说,你处于 F:\temp 目录下的时候,直接执行 svn import svn://192.168.0.1/arm ,那么当你取出你的代码的时候,你会发现,居然多了一层名为 arm 的目录。结果,你就必须使用类似 svn://192.168.0.1/arm/arm 这样怪异的URL,才能够正确访问到你的代码们。

这一点粗看好像不是特别重要,不过联想到前述的目录授权规则,可都是按照标准的项目目录结构来设计的。突然之间,你项目的根目录之上,多出了一个名为 arm 的目录,那么我们的所有目录授权规则,基本上都要全部改过了,否则除了根目录,你永远会得到一个莫名其妙的“access denied”。由于 Subversion 在这一步骤上的界面不够人性化,因此这是初学者很容易弄混的地方之一。

3.2.7   测试
在服务器上,打开一个 DOS Prompt 窗口,输入如下指令:

svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117

我们应该得到如下目录结构:

arm
├─diary
│  └─headquarters
├─ref
└─temp

然后修改ref目录下任意文件并提交,服务器将会报错“Access denied”,Bingo!

4   深入本章将详细介绍前一章所涉及的两个配置文件, svnserve.conf 和 authz.conf,通过对配置逐行的描述,来阐明其中的一些细节含义。除此之外的其他配置、安装等内容,不是本文重点,读者若有什么疑问,请参考后面“参考文献”中列出的一些文档。

这里首先要注意一点,任何配置文件的有效配置行,都 不允许存在前置空格 ,否则程序可能会出错,给你一个 Option expected 的提示。也就是说,如果你直接从本文的纯文本格式中拷贝了相关的配置行过去,需要手动将前置的4个空格全部删除。当然了,如果你觉得一下子要删除好多行的同样数目的前置空格是一件苦差使,那么也许 UltraEdit 的“Column Mode”编辑模式,可以给你很大帮助。

4.1   svnserve.confarm\conf\svnserve.conf 文件,是 svnserve.exe 这个服务器进程的配置文件,我们逐行解释如下。

首先,我们告诉 svnserve.exe,用户名与密码放在 passwd.conf 文件下。当然,你可以改成任意的有效文件名,比如默认的就是 passwd:

password-db = passwd.conf

接下来这两行的意思,是说只允许经过验证的用户,方可访问代码库。 那么哪些是“经过验证的”用户呢?噢,当然,就是前面说那些在 passwd.conf 文件里面持有用户名密码的家伙。这两行的等号后面,目前只允许 read write none 三种值,你如果想实现一些特殊的值,比如说“read-once”之类的,建议你自己动手改源代码,反正它也是自由软件:

anon-access = none
auth-access = write

接下来就是最关键的一句呢,它告诉 svnserve.exe,项目目录访问权限的相关配置是放在 authz.conf 文件里:

authz-db = authz.conf

当然,svn 1.3.2 引入本功能的时候,系统默认使用 authz 而不是 authz.conf 作为配置文件。不过可能由于鄙人是处女座的,据说有着强烈的完美主义情结,看着 svnserve.conf 有后缀而 passwd 和 authz 没有就是不爽,硬是要改了。

上述的 passwd.conf 和 authz.conf 两个文件也可以作为多个代码库共享使用,我们只要将它们放在公共目录下,比如说放在 D:\svn 目录下,然后在每个代码库的 svnserve.conf 文件中,使用如下语句:

password-db = ..\..\passwd.conf
authz-db = ..\..\authz.conf

或者:

password-db = ../../passwd.conf
authz-db = ../../authz.conf

这样就可以让多个代码库共享同一个用户密码、目录控制配置文件,这在有些情况下是非常方便的。

4.2   authz.conf 之用户分组arm\conf\authz.conf 文件的配置段,可以分为两类, [group] 是一类,里面放置着所有用户分组信息。其余以 [arm:/] 开头的是另外一类,每一段就是对应着项目的一个目录,其目录相关权限,就在此段内设置。

首先,我们将人员分组管理,以便以后由于人员变动而需要重新设置权限时候,尽量少改动东西。我们一共设置了5个用户分组,分组名称统一采用 g_ 前缀,以方便识别。当然了,分组成员之间采用逗号隔开:

[groups]
# 任何想要查看所有文档的非本部门人士
g_vip = morson
# 经理
g_manager = michael
# 北京办人员
g_beijing = scofield
# 上海办人员
g_shanghai = lincon
# 总部一般员工
g_headquarters = rory, linda
# 小秘,撰写文档
g_docs = linda

注意到没有, linda 这个帐号同时存在“总部”和“文档员”两个分组里面,这可不是我老眼昏花写错了,是因为 Subversion 允许我这样设置。它意味着,这个家伙所拥有的权限,将会比他的同事 rory 要多一些,这样的确很方便。具体多了哪些呢?请往下看!

4.3   authz.conf 之项目根目录接着,我们对项目根目录做了限制,该目录只允许arm事业部的经理才能修改,其他人都只能眼巴巴的看着:

[arm:/]
@g_manager = rw
* = r

[arm:/] 表示这个目录结构的相对根节点,或者说是 arm 项目的根目录。其中的 arm 字样,其实就是代码库的名称,即前面用 svnadmin create 命令创建出来的那个 arm。
这里的 @ 表示接下来的是一个组名,不是用户名。因为目前 g_manager 组里面只有一个 michael,你当然也可以将 @g_manager = rw 这一行替换成 michael = rw ,而表达的意义完全一样。
* 表示“除了上面提到的那些人之外的其余所有人”,也就是“除了部门经理外的其他所有人”,当然也包括总经理那个怪老头
* = r 则表示“那些人只能读,不能写”
4.4   authz.conf 之项目子目录然后,我们要给总部人员开放日志目录的读写权限:

[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =

这个子目录的设置有些特色,因为从需求分析中我们知道,这个子目录的权限范围要比其父目录小,它不允许除指定了的之外其他任何人访问。在这段设置中,我们需要注意以下几点:

我敢打赌,设计svn的家伙们,大部分都是在类 unix 平台下工作,所以他们总喜欢使用 / 来标识子目录,而完全忽视在 MS Windows 下是用 \ 来做同样的事情。所以这儿,为了表示 diary\headquarters 这个目录,我们必须使用 [arm:/diary/headquarters] 这样的格式。当然如果你一定要用 \ ,那么唯一的结果就是,Subversion 会将你的这部分设置置之不理,全当没看到。
这里最后一行的 * = 表示,除了经理、总部人员、特别人士之外,任何人都被禁止访问本目录。这一行是否可以省略呢?不行,因为 权限具备继承性 ,子目录会自动拥有父目录的权限。若没有这一行,则所有帐号都可以读取 /diary/headquarters 目录下的文件。因为虽然我们并没有设置这个目录的父目录权限,可是默认的规则使得 /diary 目录的权限与根目录完全一样,从而让其余帐号获得对 /diary/headquarters 目录的 r 权限。所以简单来说, * = 这一句的目的,就是割断权限继承性,使得管理员可以定制某个目录及其子目录的权限,从而完全避开其父目录权限设置的影响。
之所以这儿需要将 @g_vip = r 一句加上,就是因为存在上述这个解释。如果说你没有明确地给总经理授予读的权力,则他会和其他人一样,被 * = 给排除在外。
如果众位看官中间,有谁玩过防火墙配置的话,可能会感觉上述的配置很熟悉。不过这里有一点与防火墙配置不一样,那就是各个配置行之间,没有 先后顺序 一说。也就是说,如果我将本段配置的 * = 这一行挪到最前面,完全不影响整个配置的最终效果。
接下来我们看看这一段:

[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r

这里的主要看点,就是 g_docs 组里面包含了一个 linda 帐号,她也同时在 g_headquarters 组里面出现,这就意味着, linda 将具备对 /ref 和 diary\headquarters 两个目录的读写权限。

4.5   authz.conf 之目录表示法在前面的描述中,我们都采用 [repos:/some/dir] 这样的格式来表示项目的某个目录,比如上一小节中的 [arm:/diary/headquarters] 。而实际上,Subversion 允许你采用 `[/some/dir] 这样的格式,即不指定代码库的方式来表示目录,此时的目录就匹配所有项目。

对于使用 svnserve 的用户来说,只有当 svnserve 运行的时候使用了 -r 参数,并且让多个代码库共享同一个目录权限文件(即 authz.conf 或 authz)时,不指明代码库名称才有可能惹麻烦。一般情况下,我们对每个代码库都会独立使用配置文件,毕竟每个项目的目录结构,都有很大不同,混在一起意义不大。因此一般来说,为简洁起见,都可以不指明代码库名称。本文全都指明了代码库名称,主要是为了将来扩展成同一个配置文件,以方便配合 Apache 服务器。

对于使用 Apache 的用户来说,它们二者可有着很大的不同,因为此时往往习惯于使用一个公共的目录权限配置文件。如果你使用了 SVNParentPath 指令,则指定版本库的名字是很重要的,因为假若你使用后者,那么 [/some/dir] 部分就会与所有代码库项目的 [/some/dir] 目录匹配。如果你使用 SVNPath 指令,则这两种表示方式就没有什么区别了,毕竟只有一个版本库。

4.6   authz.conf 的其他注意点父目录的 r 权限,对子目录 w 权限的影响
把这个问题专门提出来,是因为在1.3.1及其以前的版本里面,有个bug,即某个帐号为了对某个子目录具备写权限,则必须对其父目录具备读权限。因此现在使用了1.3.2及其更高的版本,就方便了那些想在一个代码库存放多个相互独立的项目的管理员,来分配权限了。比如说央舜公司建立一个大的代码库用于存放所有员工日志,叫做 diary,而arm事业部只是其中一个部门,则可以这样做:

[diary:/]
@g_chief_manager = rw
[diary:/arm]
@g_arm_manager = rw
@g_arm = r

这样,对于所有arm事业部的人员来说,就可以将 svn://192.168.0.1/diary/arm 这个URL当作根目录来进行日常操作,而完全不管它其实只是一个子目录,并且当有少数好奇心比较强的人想试着 checkout 一下 svn://192.168.0.1/diary 的时候,马上就会得到一个警告“Access denied”,哇,太酷了。

默认权限
如果说我对某个目录不设置任何权限,会怎样?马上动手做个试验,将:

[diary:/]
@g_chief_manager = rw

改成:

[diary:/]
# @g_chief_manager = rw

这样就相当于什么都没有设置。在我的 svn 1.3.2 版本上,此时是禁止任何访问。也就是说,如果你想要让某人访问某目录,你一定要显式指明这一点。这个策略,看起来与防火墙的策略是一致的。

只读权限带来的一个小副作用
若设置了:

[arm:/diary]
* = r

则 Subversion 会认为,任何人都不允许改动 diary 目录,包括删除、 改名 ,和 新增 。

也就是说,如果你在项目初期创建目录时候,一不小心写错目录名称,比如因拼写错误写成 dairy,以后除非你改动 authz.conf 里面的这行设置,否则无法利用 svn mv 命令将错误的目录更正。

anon-access 属性对目录权限的影响
你想将你的代码库开放给所有人访问,于是你就开放了匿名访问权限,在 svnserve.conf 文件中添加一行: anon-access=read 。可是对于部分目录,你又不希望别人看到,于是针对那些特别目录,你在 authz.conf 里面进行配置,添加了授权访问的人,并添加了 * = 标记。你认为一切OK了,可是你缺发现,那个特别目录却无法访问了,总是提示 Not authorized to open root of edit operation 或者 未授权打开根进行编辑操作 。你再三检查你配置的用户名与密码,确认一切正确,还是无法解决问题。

原来,Subversion 有个小 bug ,当 anon-access=read 并且某个目录有被设置上 * = 标记,则会出现上述问题。这个 bug 在当前最新版本上(v1.4)还存在,也许在下一版本内可以被改正吧。

解决的办法是,在 svnserve.conf 中,将 anon-access 设置成 none 。

5   改进5.1   对中文目录的支持上午上班的时候,Morson 来到 Michael 的桌子前面,说道:“你是否可以将我们的北京办、上海办目录,改成用中文的,看着那些拼音我觉得很难受?” Michael 心想,还好这两天刚了解了一些与 unicode 编码相关的知识,于是微笑地回答:“当然可以,你明天下午就可以看到中文目录名称了。”

使用 svn mv 指令,将原来的一些目录改名并 commit 入代码库,改名后的目录结构如下:

arm
├─工作日志
│  ├─总部人员
│  ├─北京办
│  └─上海办
├─公司公共文件参考目录
└─临时文件存放处

修改代码库的 authz.conf 文件,将相应目录逐一改名

UTF-8 格式的 authz.conf 文件,以及 BOM

将配置文件转换成 UTF-8 格式之后,Subversion 就能够正确识别中文字符了。但是这里需要注意一点,即必须保证 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的缩写,指 UNICODE 文件头部用于指明高低字节排列顺序的几个字符,通常是 FF FE ,而将之用 UTF-8 编码之后,就是 EF BB BF 。由于 UTF-8 文件本身不存在字节序问题,所以对 UTF-16 等编码方式有重大意义的 BOM,对于 UTF-8 来说,只有一个作用——表明这个文件是 UTF-8 格式。由于 BOM 会给文本处理带来很多难题,所以现在很多软件都要求使用不带 BOM 的 UTF-8 文件,特别是一些处理文本的软件,如 PHP、 UNIX 脚本文件等,svn 也是如此。

目前常用的一些文本编辑工具中,MS Windows 自带的“记事本”里面,“另存为”菜单保存出来的 UTF-8 格式文件,会自动带上 BOM 。新版本 UltraEdit 提供了选项,允许用户选择是否需要 BOM,而老版本的不会添加 BOM。请各位查看一下自己常用的编辑器的说明文件,看看它是否支持这个功能。

对于已经存在 BOM 的 UTF-8 文件,比如说就是微软“记事本”弄出来的,我们可以利用 UltraEdit 来将 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”菜单将文件转换成本地编码,通常是GB2312码,然后再使用“ASCII TO UTF-8(UNICODE Editing)”来转换到 UTF-8 即可。当然,这么操作之前,你肯定得先保证,你的 UltraEdit 保存出来的 UTF-8 文件的确是不带 BOM 的。

Subversion 为什么讨厌 BOM 呢?我不知道,毕竟我也只是一个普通用户,不是开发人员。如果你感兴趣,并且英文够好的话,不妨参考一下这个讨论: http://subversion.tigris.org/servlets/ReadMsg?list=users&msgNo=51334

6   参考文献Subversion官方文档, http://svnbook.red-bean.com
Subversion 1.3变更记录, http://subversion.tigris.org/svn_1.3_releasenotes.html
Subversion FAQ, http://subversion.tigris.org/faq.html
UTF-8 常见问题, http://unicode.org/faq/utf_bom.html
7   历史轨迹2006.06.04, v0.1
在 http://iusesvn.com/bbs 首次发布
2006.07.07, v0.4
加入 www.woodpecker.org.cn 的 OBP 项目
2006.10.11, v0.5
修正部分错误,调整部分章节顺序
2006.12.05, v1.0
添加“权限简介”一节
调整“实战”章的章节顺序,添加一些说明,使之更具可读性
删除一些与 apache 服务器相关的说明
添加“目录表示法”一小节
重写了“authz.conf 之项目子目录”一小节

Subversion之路---实现精细的目录访问权限控制 - apple0668 - BlogJava

星期四 八月 28, 2008

生日快乐


若即若离的感情线,一个在防守,一个在等待。小米(刘若英饰)与小南(古天乐饰)是大学时候的同学。每年小米的生日,小南都会送上祝福,唱一首五音不全的歌给小米听。彼此相知相爱,可是小米因为童年的阴影始终无法正面她与小南之间的感情。
  小米后来出国留学了,两人分隔两地但心里还是时时牵挂彼此。历年的生日,小米仍记得小南的祝福。
  仿佛各自又有了不一样的生活,可是当年的记忆还在。最后小南告诉小米自己就要踏上婚姻的道路,小米伤心欲绝,要强的她此刻才剖白心声。就算他们仍然彼此相爱,可一切都已经无法回头……

[Read More]

星期六 八月 23, 2008

Lotus 莲花 Esprit V8

Lotus  莲花 Esprit V8 点击进入下一页

星期五 八月 22, 2008

百度_双双吧_!!一个感觉很像双的气质美女

 

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:16 回复此发言


2
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

可能大家看过了/

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:17 回复此发言


3
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

个人很喜欢的说。

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:18 回复此发言


4
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

PP

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:19 回复此发言


5
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

p

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:20 回复此发言


6
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

pp

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:21 回复此发言


7
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

上流社会的美女啊

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:21 回复此发言


8
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

PP

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:22 回复此发言


9
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

SWEET

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:23 回复此发言


10
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

PP

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:23 回复此发言


11
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

!!

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:24 回复此发言


12
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

like

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:25 回复此发言


13
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

多才多艺!!》!》。。

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:25 回复此发言


14
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:26 回复此发言


15
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

长腿。

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:27 回复此发言


16
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:27 回复此发言


17
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

当然看过了,林逸欣嘛!!!!!!!超喜欢
我来加一张~~~~~~~~~

贴子相关图片:

作者: 轻巧一刀

2008-8-6 21:28 回复此发言


18
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:28 回复此发言


19
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:28 回复此发言


20
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:29 回复此发言


21
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:30 回复此发言


22
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:30 回复此发言


23
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

.风格很好

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:32 回复此发言


24
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

last

贴子相关图片:

作者: 122.13.203.*

2008-8-6 21:33 回复此发言


25
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

找了好久她的资料。。分享下。。
名字:林逸欣 
英文名:Shara 莎拉 
年龄:22岁 
出生:1986年11月5日 
身高:167cm 
体重:46kg 
学历:永福国小音乐班 - 大成国中音乐班 - 台南女中音乐班-台湾师范大学音乐系 
活动:奇美管弦乐团的团员 主持过中天电视台台湾脚逛大陆的节目
出身:台南市 
父亲:医生 
哥哥:台大数学系学生 
就读:台湾师范大学音乐系大四
宠物:猫咪 
专长:小提琴(十年),钢琴(十五年),古筝(两年)

作者: 122.13.203.*

2008-8-6 21:34 回复此发言


26
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

这些我知道啊~~~~~~~~~~~~~~~~~~~

作者: 轻巧一刀

2008-8-6 21:38 回复此发言


27
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

啊。。那随便问一下。
她是演艺圈的人吗?。感觉她不怎么红啊,,
那里可以找到更多她的相关资料。。
主持过中天电视台台湾脚逛大陆的节目??
有这个的视频吗??》

作者: 122.13.203.*

2008-8-6 21:46 回复此发言


28
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

不知道啊,我知道她上过我猜~~~~~~~~~~~~~~

作者: 轻巧一刀

2008-8-6 21:49 回复此发言


29
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

我发现你们好喜欢 偷梁换柱哦 
这些图片有的 是 林逸欣 有的 不是 好伐
?!!

作者: 天_麒麟

2008-8-7 02:25 回复此发言


30
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

不过要加精啊 
楼主 辛苦 !

作者: 天_麒麟

2008-8-7 02:26 回复此发言


31
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

才女

作者: Budenkov

2008-8-7 05:52 回复此发言


32
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

照片全是 林逸欣的啊,,
只不过有点是最近的,有点是比较早期的。。
她现在的样子和上我猜时差蛮大的,,
越来越PL啦。。

作者: 122.13.202.*

2008-8-7 13:31 回复此发言


33
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

上我猜时的。。
视频看过了,,百度有。。
声音好好听啊。。

贴子相关图片:

作者: 122.13.202.*

2008-8-7 13:36 回复此发言


34
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

原来是翩黄一点的头发,,就不那么显气质。。

贴子相关图片:

作者: 122.13.202.*

2008-8-7 13:42 回复此发言


35
回复:!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

xf

贴子相关图片:

作者: 122.13.202.*

2008-8-7 13:43 回复此发言

百度_双双吧_!!一个感觉很像双的气质美女(多图)!!!!!!!!!!

视觉欺骗

 

(1):把目光集中在中间的+字,你会发现,移动的紫点会变绿
(2):盯住十字形,时间再长一点,你会发现,除了绿色的点外,其他所有的点都消失了。

贴子相关图片:

作者: jy03023383

2008-8-17 21:50 回复此发言


3
回复:人类的大脑随时都在欺骗我们(图)太好玩拉!

Follow the instruction below. 按照下面的指引
1) Stare at the 4 little dots on the middle of the picture for 30 seconds 
盯住图片中间的4个小点,坚持30秒
2) then look at a wall near you 然后往你附近的墙上看
3) a bright spot will appear 会出现一个明亮的东西 
4) twinkle a few times and you‘ll see a figure 闪过几次后,你会看到一个头像
5) What do you see? Or even WHO do you see? 看到什么了?或者说,你看到谁了?

贴子相关图片:

作者: jy03023383

2008-8-17 21:51 回复此发言

百度_双双吧_人类的大脑随时都在欺骗我们(图)太好玩拉!

目前大学最流行的话~!!!!

 

   1、80后的重要任务就是制造08后  
2、事实证明在这个世界上,感情经得起风雨,却经不起平淡;友情经得起平淡,却经不起风雨  
3、人生没有彩排,每天都是直播;不仅收视率低,而且工资不高  
4、能用钱解决的问题都不是问题,可问题是我是穷人  
5、春天到了,小树发芽了,股市也跟着变绿了  
6、人家有的是背景儿,而我有的只有背影儿  
7、唯女人与英雄难过也,唯老婆与工作难找也  
8、不要整天抱怨生活,生活根本就不会知道你是谁,更别说它会听你的抱怨  
9、是金子总要发光的,但是当满地都是金子的时候,我自己也不知道自己是哪颗了  
10、在此呼吁大家,学会修自己的笔记本……嗯,学会修自己的笔记本是很重要的……从前有个人,他不会修自己的笔记本……后来的事情大家都知道了  
    11、姐不是广场上算卦的,唠不出那么多你爱听的嗑  
12、只知道刚的人,难免会被折断;只有柔的人,到头来终是懦夫  
13、找一个像EXCEL一样的男朋友——想隐藏就隐藏,想筛选就筛选,想删除就删除,一个不高兴,嘿,我还就不保存了  
14、见到我以后你会突然发现——啊,原来帅也可以这样具体呀!  
15、不是故事的结局不够好,而是我们对故事的要求过多    
16、钞票不是万能的,有的时候还需要信用卡    
17、爱情就像两个拉着橡皮筋的人,受伤的总是不愿意放手的那个    
18、鲜花往往不属于赏花的人,而属于牛屎  
19、问一同事:"你买了中石油吗?"同事说:"呸!你才买了中石油呢。你们全家都买了中石油,还买了中石化!"    
20、信念这玩意不是说出来的的,是做出来的。光荣在于平淡,艰巨在于漫长。    
21、中午在食堂叫了两个菜。吃第一个我震撼了"世界上还有比这更难吃的菜吗?"吃第二个我哭了"还真有啊"    
22、谎言与誓言的区别在于:一个是听的人当真了,一个是说的人当真了    
23、单身并不难,难的是应付那些千方百计想让你结束单身的人

百度_双双吧_<<目前大学最流行的话~!!!!>>

星期四 八月 07, 2008

公司部门英文缩写简称收集

 

总公司 Head Office
分公司 Branch Office
营业部 Business Office
人事部 Personnel Department
人力资源部 Human Resources Department
总务部 General Affairs Department
财务部 General Accounting Department
销售部 Sales Department
促销部 Sales Promotion Department
国际部 International Department
出口部 Export Department
进口部 Import Department
公共关系 Public Relations Department
广告部 Advertising Department
企划部 Planning Department
产品开发部 Product Development Department
研发部 Research and Development Department(R&D)
秘书室 Secretarial Pool
采购部 Purchasing Department
工程部 Engineering Department

行政部 Admin. Department
人力资源部 HR Department
市场部 Marketing Department
技术部 Technolog Department
客服部 Service Department

行政部: Administration
财务部 Financial Department
总经理室、Direcotor, or President
副总经理室、Deputy Director, or Vice president
总经办、General Deparment
采购部、Purchase & Order Department
工程部、Engineering Deparment
研发部、Research Deparment
生产部、Productive Department
销售部、Sales Deparment
广东业务部、GD Branch Deparment
无线事业部、Wireless Industry Department
拓展部 Business Expending Department
物供部、Supply Department

B&D business and development 业务拓展部
Marketing 市场部
Sales 销售部
HR 人力资源部
Account 会计部
PR people relationship 公共关系部

OFC (Office, 但不常见) / OMB = Office of Management and Budget 办公室
Finance 财务部
MKTG (Marketing) 市场部
R&D (Research & Development) 研发部
MFG (Manufacturing) 产品部

Administration Dept. 管理
Purchasing  Dept 采购部
Chairman/President Office // Gerneral Manager office or GM office 总经理办公室
Monitor & Support Department 监事会
Strategy Research 战略研究部
我认为翻译没有标准答案,要根据实际情况来进行决定。
有时候同一个部门,在你们厂和我们公司它的叫法就是不一样;
美国和英国或新西兰它也不一样。等等。
例如党支部,在英语国家没有这个玩意,你翻得再好,也只是自己的创造;
创造得再好,外国人看了一样不懂,一样需要你的解释。

外销部: Overseas Department,International Sales Section,Export Section
财务科:Financial/Fiscal Department
党支部:Communist Party Office
会议室:Meeting Room/Hall/Auditorium,或Conference Hall/Auditorium或直接Auditorium, 视其大小而定了。
会客室:Reception Lounge/Room/House,或Meeting Room或Guest Room
质检科:Back-check Section/Department,Quality-inspection/Quality Control Department
内销部:Domestic Sales Section/Department
厂长室:Miller/Director/President' Office( 这很取决于你们厂的类型和规模)
行政科:Administration Section/Department,Service section
技术部:Technology Section
档案室:Archives(Office)
生产科:Production/Processing Section

一句话,不管选哪个,都得与自己公司或工厂的规模,类型,性质和结构相适应。

外销部: EXPORT DEPARTMENT
财务科: FINANCIAL DEPARTMENT
党支部: BRANCH OF THE PARTY
会议室: MEETING ROOM
会客室: RECEPTION ROOM
质检科: QUALITY TESTING DEPARTMENT
内销部: DOMESTIC SALES DEPARTMENT
厂长室: FACTORY DIRECTOR'S ROOM
行政科: ADMINISTRATION DEPARTMENT
技术部: TECHNOLOGY SECTION
档案室: MUNIMENT ROOM
生产科: MANUFACTURE SECTION

公司部门英文缩写简称收集 - C.E.O. - 寻梦社区门户 - powered by X-Space

星期一 八月 04, 2008

从IT部门的角度看CommuniGate Pro

 

从IT部门的角度看CommuniGate Pro
Internet 通信服务器,能够提供运营商级的语音、Email和协作服务。

介绍(Introduction)

CommuniGate Pro是Stalker Software公司广受赞誉的通信系统。CommuniGate Pro软件包括Internet standard IMAP, POP3, 和SMTP服务。不仅如此,它还提供了用户化的基于Web的电子邮件通路、先进的反病毒/反垃圾性能、LDAP支持、用于个人网页的内置Web服务器,以及艺术级的列表服务器(list server)。
本综述主要是为评价不同的Internet通信系统的现代IT组织而设计的,评价的过程通常有多个部分所组成,从有关软件结构的一般问题到展望系统将来的发展。因此,我们将这部分内容分为相关的几部分:基本产品/公司介绍、准备和软件安装、增加、转移用户、正在进行的维护、与其它程序的结合以及对未来发展的支持。
基本部分
(1) 经过证实的 经过证实,CommuniGate Pro是可以在全世界范围的用户站点安装并运行几千个服务器的解决方案。执行的范围从几百个用户系统到几亿个。 由于CommuniGate Pro可靠的性能和标准的结构,它可以用作提供大范围服务的平台,包括用于大型ISPs的基于网络的电子邮件,用于telcos的统一的通信功能,和用于无线服务供应商的SMS系统。
(2) 基于标准的 CommuniGate Pro Server以Internet通信标准为基础,通过选择开放式基于标准的解决方案,可以帮助您创建可扩展的通信平台--与您的商业共同发展。 所支持的标准包括:SMTP/ESMTP、IMAP、POP和RPOP、HTTP、LDAP)、ACAP、DNR、SNMP和SSL/TLS。
(3) Webmail界面 CommuniGate Pro执行本地Webmail界面。这意味着Webmail界面不是在POP或IMAP服务器上面的附加程序,而是CommuniGate Pro系统的组成部分。Webmail组件直接与Mailbox Manager组件相通,这就帮助CommuniGate Pro server同时处理几千个Webmail对话,而不会滥用系统资源。
Webmail是完全用户化的,服务器上的每个不同的域都可以有不同的外观。还有内置的国际化字符集和Unicode支持,对于那些需要多语言支持的用户是很有用的。
(4) 运行时间需求 随着电子邮件逐渐成为主要的商业信息媒体,任何可能的通信解决方案都应该提供"邮局级"的可靠性,满足"五个9" (99.999%)的运行时间需求。
一般情况下,requirement不能满足单个服务器解决方案。电子邮件系统比传统的网络服务器系统更为复杂,它需要更高的数据修改速度、更复杂的数据处理过程,并需要支持更多的访问方式(POP3, IMAP4, WebMail等)
CommuniGate Pro可以运行在多种配置环境下,根据您的运行时间要求,从单个服务器到fail-over,或者全面的群集系统(cluster system)。
独一无二的CommuniGate Pro动态群集技术提供了现代通信所需要的高性能和可靠性。
(5) 安全性 CommuniGate Pro对于它所有的通信服务(SMTP, POP, IMAP,HTTP, LDAP, ACAP, POPPWD)支持安全通信(SSL/TLS),并且与所有支持SSL的浏览器和邮件客户端(包括Microsoft Outlook, Outlook Express和Netscape Messenger)100%兼容。安全性连接(Secure connection)可以使用标准"secure ports"或现代"secure on-the-fly"方法(STARTTLS for SMTP, IMAP和ACAP, STLS for POP)来建立。
CommuniGate Pro对于它所有的通信服务(SMTP (SMTP AUTH), IMAP, POP, LDAP, ACAP, POPPWD)同样也支持安全鉴别(APOP/SASL)。这一特点帮助客户邮件管理员不需用户发送用户密码就可以直接鉴别他们。
服务器/域管理员可以指定需要"安全登录"。如果这样指定,用户可以仅告诉他们的管理员使用"安全鉴别"就可以连接到他们的帐号。此外,用户也可以使用安全连接(SSL/TLS)或其它密码交换的方法来连接到服务器。
如果您的公司有鉴别系统,CommuniGate Pro可以轻松与它们结合。
对于病毒防护或内容过滤,CommuniGate Pro使用第三方的产品(插件)来扫描所有信息。CommuniGate
Pro过滤器插件(filter plugins)提供了一个能够通过SMTP来扫描信息的坚实的解决方案。
CommuniGate Pro插件在CommuniGate Pro服务器一旁运行,不会影响信息传输协议。所有的信息都会被扫描,而不仅是那些通过特殊邮件传输协议的信息。
CommuniGate Pro目前支持用于McAfee Virus Scanner的插件。 CommuniGate Pro还有有效的内置反垃圾邮件的功能。管理员可以通过直观的网络界面,来指导系统什么时候来接收或拒收信息。这个界面同样也提供了非常灵活的选项来控制合法信息的路由。
准备和安装
(1) 多操作系统和硬件支持 既然CommuniGate Pro支持这么多的操作系统,您就不需要购买新的硬件或对您的员工进行再教育。本产品基于Stalker的基本框架,帮助我们轻松支持所有重要的操作系统。目前,我们支持Solaris, Tru64, Linux/LinuxPPC, FreeBSD, BSDi, WindowsNT, UnixWare,MacOS X, AIX, Cobalt, HP/UX, IRIX, AS/400 以及 Linux for S390,让您充分利用您现有的硬件/操作系统基础结构。本服务器充分利用现代多线程和多处理器环境,不仅可以进行有效而可靠的信息处理,而且大大节省了您的系统资源。
(2) 灵活的存储子系统(storage subsystem) 存储子系统是通信系统的重要组成部分。其性能和可靠性主要依赖于这个子系统。CommuniGate Pro服务器不使用文件锁定(file-locking)机制,它使用NAS,比其它解决方案要快3-5倍。CommuniGate Pro群集环境可以使用现代群集文件系统,如Sun Cluster 3.0和Compaq的 Tru64。
(3) Install/Setup 对于您选择的不同的操作系统,安装过程是不同的,但是CommuniGate Pro installer管理整个安装进程。例如,在Windows NT系统,它作为邮政服务(mail service)来安装,而在UNIX 和 Linux系统,它必须配置为默认的信息处理程序(default message handler)。在您安装完主要的系统文件之后,您可以通过Web管理界面执行更为先进的配置。
在所有的平台上,CommuniGate Pro的界面和文件格式是相同的,因此它可以轻松、迅速地移到具有不同操作系统的新服务器上。
增加/转移用户
用户帐号
新的用户可以通过数据库、系统文件、目录或Web管理界面来增加。为了支持从其他电子邮件系统实现用户转移,CommuniGate Pro提供了简单的工具来输入现有的用户和邮箱。对于需要转移上千个用户的公司,这些工具可以大大降低完成转移过程的复杂性,减少所需的时间。 CommuniGate Pro为它所有的帐号提供POP, IMAP, 和 WebMail访问。不需要为每个帐号(包括同时多路访问)指定访问类型。
正在进行的维护
(1) 每日管理(Day to Day Administration)
CommuniGate Pro有着一系列容易管理特点,让您的职员专心做其它的工作。系统管理员可以选择在直观的Web管理界面工作或是使用CLE(命令行界面)。 在Web管理界面中,设置分为4个部分:服务器和模块设置、帐号和域管理、目录管理和服务监控。其中设置、帐号和部分可以用来配置系统、增加用户帐号,监控部分则用在每日监控全部的服务器性能和提供为服务器日志的访问。
此外,Web管理界面支持"domain delegation",每个域都可以有它自己的管理员。
CommuniGate Pro server可以使用多套您在Web界面中定义的"自动规则"来自动处理信息。这些规则可用于所有送到服务器上的信息。
(2) 技术支持 Stalker Software提供了无限的电话/电子邮件技术支持,2年软件升级和免费的远程软件监控。客户也可以使用CommuniGate Pro的邮件列表来从其他客户那里获取免费技术支持和建议。本软件升级时会全部重建而没有补丁。
(3) 您的终端用户 CommuniGate Pro支持从任何标准兼容的电子邮件客户端、网络浏览器等的访问,允许您的用户继续使用他们喜爱的电子邮件客户端,如Outlook Express, Netscape, Eudora, 或Pine,大大减少他们的支持费用。 在高负荷的情况下,CommuniGate Pro会将服务客户需求放在首位。 在最近由Network Computing举办的基准测试(benchmark test)中,参赛的产品有CommuniGate Pro,Rockliffe, Critical Path, iPlanet, Mirapoint和Novell公司的产品。 CommuniGate Pro是唯一在整个测试过程中客户端不出一点错的公司。其它公司的产品都在高负荷的情况下显示"time out"。 全面的邮箱过滤、上传和共享功能,帮助您的用户更有效地管理他们每日繁多的电子邮件。每个用户都可以自己定义他们的信息处理规则--按照自己习惯的方式,大大减轻您的系统管理员的压力。
与其它系统的结合
可展开性
CommuniGate Pro Server支持用户使用外部程序。这些程序(脚本、数据库、RADIUS authentication等)不是由CommuniGate Pro Server直接提供,而往往是客户的技术支持创建的,并在您的网站上执行。
所有在CommuniGate Pro网络浏览器界面上可用的管理功能都可用在它特殊的CLI/API端口上。Perl 和 Java 模块 (CLI "wrappers";)可用于从Stalker站点下载,并可以简化CommuniGate Pro与现有的管理系统的结合。

对未来发展的支持

(1) 可升级性
CommuniGate Pro适用于多个平台,可以为上千个用户帐号提供访问。对于需要处理数百万个帐号的特别大的网站,则可以适用静态和动态群集支持。
(2) 真正的群集(True Clustering)
为了满足邮件服务器的需要,您可以展开CommuniGate Pro动态群集解决方案。这个动态群集软件帮助站点满足99.999%的运行时间需求。
这个解决方案基于"同步帐号",由使用特殊界面-服务器协议(inter-server protocol)的群集控制器(Cluster Controller)来执行,从而保证在某一时刻,任何帐号都只能由一个群集成员(Cluster Member)来直接使用。如果群集成员A已经打开帐号X,而另外一个成员B也试图打开同一个帐号的话,控制器会引导它连接到服务器A,并将它用做"代理服务器"来访问帐号数据。通过使用更快的多线程技术代替文件系统锁定,它可以执行每个群集成员的同步。
完整的基于Web、CLI/API和SNMP管理界面将整个群集呈现为单个系统(单个系统图象)

产品新特性

CommuniGate Pro最新版本将通信、协作和网络电话服务集成为一个解决方案。网络电话服务程序被内置到CommuniGate Pro的动态集群内,具备全主动的集群“SIP Farm”,能够容纳上千域名和数百万个用户,正常工作时间达99.999%。

CommuniGate Pro 基于开放SIP标准,用户可以选择客户端,包括IP电话、软件客户端、传统电话、移动设备、浏览器和IM代理等,其访问和登录过程完全相同。仍然通过PSTN链接或EUNM来使用传统电话号码。新版CommuniGate Pro能够使用SIP路由到多个并发网关,包括IP-to-PSTN,IP-to-IP, PSTN-to-IP, PSTN-to-PSTN。另外,使用CommuniGate Pro,所有用户都可以选择他们偏爱的客户端进行email、协作和电话通信,而且相互之间可以交互操作。

CommuniGate Pro的VoIP程序包括:

远程电信会议服务器——多方会议无需依赖外部资源,用户可以创建和主持会议;

IVR(自动应答)——交互式菜单系统,可以对系统内的每个域名甚至是每个账号进行个性化设置;

ACD(自动呼叫分发)——为呼叫中心提供的智能呼叫查询;

语音邮件和自服务——可将语音邮件发送到收件箱,转发至您的移动设备,或当语音邮件达到时,通过IM进行接受自动通知;

CommuniGate编程语言开发平台——开放式并经过证明的开发语言,能够快速开发语音程序,或通过默认方式对产品内程序进行扩展。CommuniGate Pro如今当作一个完全集群程序服务器,能够通过WebDAV、SOAP/.NET、VoiceXML等对内部的IM、Email、语音程序和外部数据及程序进行扩展和集成。

结论
Stalker Software希望您尝试一下CommuniGate Pro产品,您就会明白它是如何满足您公司的需要。我们提供了完整的支持版本,您可以从Stalker Software的网站(www.stalker.com)下载和安装。你将会发现CommuniGate Pro软件所具有的先进的通信特点、可升级性、可靠性以及无可匹敌的性能,它将是您公司的最佳选择!

昆仑软件在线-特别服务

星期四 七月 10, 2008

windows下架设subversion服务

 

一、下载安装
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
默认安装即可。
二、建立Repository

1. 创建目录,例如:c:\svnsrc\csharp
2. 打开命令窗口, 键入 :svnadmin create --fs-type fsfs c:\svnsrc\csharp
三、配置Repository

进入Repository目录,在本文中是 c:\svnsrc\csharp ,你会看到conf目录,进入该目录,你会看到svnserve.conf和passwd两个文件

对两个文件作如下修改

svnserve.conf

### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)
### Visit http://subversion.tigris.org/ for more information.
[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = read
auth-access = write
### The password-db option controls the location of the password-db = passwd
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### Uncomment the line below to use the default password file.
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the conf
### directory.  If you don't specify an authz-db, no path-based access
### control is done.
### Uncomment the line below to use the default authorization file.
# authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
# realm = My First Repository

passwd

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
# harry = harryssecret
# sally = sallyssecret
user = password

四、启动subversion

打开命令窗口键入:svnserve -d -r c:\svnsrc
默认端口是3690,如果不幸这个端口被别的程序暂用,可以通过选项 svnserve -d --listen-port 端口号

url格式为:svn://ip地址//Repository名,在本文中是svn://127.0.0.1/csharp
五、将Subversion安装成windows service

sc create svnservice binpath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service -r c:\svnsrc" displayname= SVNService depend= Tcpip start= auto

总结:这样,完成了在windows下架设subversion服务

windows下架设subversion服务 - C#.Net/Magicworks - 博客园

Subversion简明手册--服务器管理(代码库的基本管理、启动服务器、与Apche web server集成) - 修行的武者 - DonewsBlog

 

作为代码库数据存放地的服务器,自然是开发管理的重点对象之一。Subversion服务器管理涉及的主要命令:

svnlook

查看代码库的信息,其中的路径是代码库的路径。

svnadmin

subversion管理工具。

svndumpfilter

指定dump代码库的过滤条件。如,在导出的代码库中包含哪些文件,排除哪些文件。

svnserve

subversion服务器程序。

Subversion没有提供远程的服务器控制工具,对于服务器的管理命令必须运行在与代码库相同的机器上。这样做的目的也是为了更加的安全。

主要的服务器管理活动:

1. 代码库的基本管理。

创建

动机

建立整个项目的版本控制的环境和目录结构。

步骤

1. svnadmin create 目录名。目录可以存在,也可以不存在。目录如果存在,目录必须为空目录。

2. 创建版本库的本地内容。如果是全新的项目,那么可能就只有空的目录结构。如果是进行中纳入版本控制的项目(即以前项目内容没有使用版本控制),那么需要先把整个项目复制到服务器的上。这种情况下,目录包含目录结构以及项目文件。

3. svn import 目录 代码库存放位置 -m 消息。成功后,目录中的内容进入“代码库存放位置”,目录本身就没用了。

注意:目录本身不会进入代码库,只有目录下的内容才会进入。如:

project

/src

/lib

/readme.txt

使用svn import project …后,在代码库中有readme.txt,src,lib,而没有project。为了使project进入代码库,那么在它的上一级在建一个目录,如tmp,使用这个目录作为import的目录。

导出

动机

备份代码库,Subversion的导出文件格式是OS无关的。

步骤

svnadmin dump 版本库目录 > 文件名

导入

动机

þ 代码库的数据迁移,如从一种OS到另一种OS。

þ 恢复损坏的代码库。

þ 将原来大的代码库拆分成多个小的代码库,如原来的代码库目录如下:

projects

/project1

/project2

/project3

现在想以project1、project2、project3分别作为一个代码库来进行版本控制。

þ 将小代码库合并,即上一种情况的反面。

步骤

1. 获取代码库的导出文件。注意:周期备份的重要性。当代码库损坏后,dump出来的文件也肯定是坏的。此时,就必须使用以前备份的文件。

2. svnadmin create 新代码库目录。

3. 拆分版本库。如果不需要,跳过此步。在Windows下(unix下使用cat):

type 导出文件 | svndumpfilter include(exclude) path > 新导出文件

4. svnadmin load 新版本库目录 < 导出文件。如果是合并,那么需要指定父目录:

svnadmin load新版本库目录 --parent-dir 父目录< 导出文件

清理事务

动机

清除提交死事务。通常,事务结束(成功或失败)时会被清除。但是,在有些异常情况下,会导致清除工作永远不再发生。

步骤

1. svnadmin lstxns来列出未处理的transaction。

2. 使用svnlook加上--transaction来查看事务的属性。

3. 确认无误之后,使用svnadmin rmtxns 事务名来清除事务。

也可以使用一条命令来完成,如:

svnadmin rmtxns myrepos 'svnadmin lstxns myrepos '

修复版本库

动机

解锁代码库。如由于前次执行时,断电导致前一个用户锁住代码库。

步骤

svnadmin recover 版本库目录,在执行这个命令时,确定是独占代码库,在执行完之后,重启服务器。

释放无用的数据库日志

动机

节约硬盘空间。(仅对代码库格式为Berkeley DB时需要)。

不用的数据库日志,是指活动数据库不用的日志。但是这些文件需要被保存,以防万一需要时恢复数据库。

步骤

1. 列出无用日志文件

svnadmin list-unused-dblogs 代码库目录

2. 归档并释放

svnadmin list-unused-dblogs 代码库目录 | xargs rm

2. 启动服务器。Subversion支持的存取协议:

file:///

本地文件存取,此时代码库位于本地。如:file:///X:/path/to/repos。

http://

通过webdav连接知道Subversion代码库的Apache http server来存取代码库。对于Apache http server需要安装subversion提供的关于webdav的模块,同时还需经过相关的配置。如:http://svn.example.com/repos/calc。

https://

与http://相同,但使用ssl。

svn://

subversion协议。如:svn://example.com/usr/local/repos/project

svn+ssh://

subversion协议,并有ssh加密。如:svn+ssh://example.com/usr/local/repos/

对于file:///协议,不需要启动Subversion的服务器守护进程,svnserve。svnserve的开关含义:

- -i 每个请求会产生一个svnserve进程。

- -t 一般用于RSH和SSH,对于每个经过验证验证的用户来说,就象本地用户通过File:///来存取代码库一样。这个用户需要有操作Repository的权限。

- -d 以守护进程的方式运行,所有请求都有一个svnserve进程。

当服务器运行之后,需要使用代码库的绝对路径来存取。如版本库位于/usr/local/repositories/project1,那么对于客户端对应的访问的url:

svn://host.example.com/usr/local/repositories/project1,

为了简化和安全,可以使用-r来指定root。如svnserve -d -r /usr/local/repositories。那么,客户端使用时直接使用svn:// host.example.com/就可以访问代码库的根目录。

3. 与Apche web server集成,这样用户就可以通过http://来访问代码库。主要的步骤:

a) 环境配置:最简单的做法就是先安装Apache Web Server,然后安装Subversion。这样相关的配置(包括Web Dav和权限)都会自动的完成。手动配置的做法,详见subversion的手册。

b) 代码库的配置,在httpd.conf文件中:

目的

配置

共享单个代码库

<Location /repos>

DAV svn

SVNPath /absolute/path/to/repository

</Location>

共享多个代码库,如果这些代码库有共同的父目录

<Location /svn>

DAV svn

# /svn/foo映射到/usr/local/svn/foo

SVNParentPath /usr/local/svn

</Location>

注意,在location中指定的地址不要有重叠的。如已经存在一个documentroot是www,那么就不要指定/www/repo。否则,apache将不知如何处理请求的url。此时,启动apache(不需要启动svnserve进程),客户端就可以使用http://来访问代码库了。

Subversion简明手册--服务器管理(代码库的基本管理、启动服务器、与Apche web server集成) - 修行的武者 - DonewsBlog

星期一 七月 07, 2008

用Java实现PDF报表 - 无色叶子 - JavaEye技术网站

 

一、前言

在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。

二、iText简介

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

iText的安装非常方便,在http://www.lowagie.com/iText/download.html - download 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

三、建立第一个PDF文档

用iText生成PDF文档需要5个步骤:

①建立com.lowagie.text.Document对象的实例。

Document document = new Document();

②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。

PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF";));

③打开文档。

document.open();

④向文档中添加内容。

document.add(new Paragraph("Hello World";));

⑤关闭文档。

document.close();

通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

建立com.lowagie.text.Document对象的实例

com.lowagie.text.Document对象的构建函数有三个,分别是:

public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);

构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。

通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。

书写器(Writer)对象

一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。

设定文档属性

在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:

public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)

其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:

public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN) 

如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

添加文档内容

所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。

四、文本处理

iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:

Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

五、表格处理

iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。

类com.lowagie.text.Table的构造函数有三个:

①Table (int columns)
②Table(int columns, int rows)
③Table(Properties attributes)

参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。

建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:

1:Table table = new Table(3);
2:table.setBorderWidth(1);
3:table.setBorderColor(new Color(0, 0, 255));
4:table.setPadding(5);
5:table.setSpacing(5);
6:Cell cell = new Cell("header";);
7:cell.setHeader(true);
8:cell.setColspan(3);
9:table.addCell(cell);
10:table.endHeaders();
11:cell = new Cell("example cell with colspan 1 and rowspan 2";);
12:cell.setRowspan(2);
13:cell.setBorderColor(new Color(255, 0, 0));
14:table.addCell(cell);
15:table.addCell("1.1";);
16:table.addCell("2.1";);
17:table.addCell("1.2";);
18:table.addCell("2.2";);
19:table.addCell("cell test1";);
20:cell = new Cell("big cell";);
21:cell.setRowspan(2);
22:cell.setColspan(2);
23:table.addCell(cell);
24:table.addCell("cell test2";);

运行结果如下:

header  
example cell with colspan 1 and rowspan 2  1.1 2.1  
1.2 2.2  
cell test1 big cell  
cell test2 

代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

代码6-10行用于设定表格的表头,第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列;为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显示。

代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。

往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。

六、图像处理

iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。

Image gif = Image.getInstance("vonnegut.gif";);
Image jpeg = Image.getInstance("myKids.jpg";);
Image png = Image.getInstance("hitchcock.png";);

图像的位置

图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。

图像的尺寸和旋转

如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:

public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)

函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。

如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。

七、中文处理

默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
Paragraph pragraph=new Paragraph("你好", FontChinese); 

八、后记

iText还有很多高级的功能,这里就不一一介绍了,具体开发时可参考发布的文档。总的来说,iText是一套java环境下不错的制作PDF的组件。因为iText支持jsp/javabean下的开发,这使得B/S应用中的报表问题能得到很好的解决。由于iText毕竟不是专门为制作报表设计,所有报表中的内容、格式都需要通过写代码实现,相对于那些专业的支持可视化设计的报表软件来说,编程的工作量就有一定程度的增加。

用Java实现PDF报表 - 无色叶子 - JavaEye技术网站

星期二 七月 01, 2008

Spring Velocity Integration

 


How I integrate Velocity template engine into the Spring Framework.

Spring Framework & Apache Velocity

I use Velocity a lot in my projects as I dont need over-engineered JSPs in my simple templates.
I use the View Layout tools to simplefy even further.


And by editing a couple of xml files, spring uses its full potential.


These libraries need to be included:



  • spring-1.2.3.jar

  • velocity-1.4.jar

  • velocity-tools-1.1.jar

  • velocity-tools-generic-1.1.jar

  • velocity-tools-view-1.1.jar


and their dependencies e.g.



  • velocity-dep-1.4.jar


And my own



but more about that later.


First here is sections of my web.xml. Some bits are just standard spring mvc setup.


<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
 
<listener>
 <description>ServletContextListener</description>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener> 
  
<servlet>
 <servlet-name>spring</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/spring/spring-servlet.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet> 


<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping> 


<!-- 
 These two mappings is a fudge due to silly web-app specs.
 It avoids having jsp forward to html files
-->
<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>/index.html</url-pattern>
</servlet-mapping> 
<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>/contact/index.html</url-pattern>
</servlet-mapping> 


<welcome-file-list>
 <welcome-file>index.html</welcome-file>
</welcome-file-list>


<!-- My own error pages, not a requirement --> 
<error-page>
 <error-code>404</error-code>
 <location>/missing.html</location>
</error-page>
 
<error-page>
 <error-code>403</error-code>
 <location>/access.html</location>
</error-page>
 
<error-page>
 <error-code>500</error-code>
 <location>/error.html</location>
</error-page> 


And here is my spring-servlet.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> 
 
 <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> 
  <property name="resourceLoaderPath" value="/"/>
  <property name="configLocation" value="/WEB-INF/velocity/velocity.properties"