Monday, April 9, 2007

Year 2000: Go West (3)



八月二十日 ( 第十天 )

从蒙大拿州进入爱德荷州时亦即进入了太平洋时区 (Pacific Time Zone),与多伦多已有三小时时差, 温哥华就处于此时区。爱德荷州只经过七十余里,即进入华盛顿 (Washington)州。风景依然秀丽,高速 公路两旁的田野平整辽阔,色彩斑斓,绿、黄、橙、褐各色相间,象鲜艳的大方格布料,只可惜无处停 车拍照。终于在一群山叠幛,河水环绕之处泊车留影,此处天蓝且低,祥云朵朵,可谓此次西行的西天了。 我们将华盛顿州的风光评为第二 (怀俄明州第一 )。

出口处一般仍无任何服务, Burger King 更是无处可觅。中午饿了很久,北虹更是有些气息奄奄了,终于 找了一家乡村风格的小餐厅,服务员是个胖老太,笑眯眯的,非常友善。

过了Seattle(西雅图),在美国境内的最后一个加油站加了比加拿大便宜许多的汽油,然后过加拿 大海关。一位女关员问我们居住 在哪里,我们说 "Toronto",她很惊讶,问 "Is it Ontario's Toronto?",回答"Yes",又问 "Are you sure?", 看来象我们这样旅行的人还是很少的。

过境处有一和平公园,是横跨美加两地的。过关后,即是温哥华了。一路直接开到北虹的师弟王伟处,却没 人在家。正欲走时他回来了,说在陈皓华家设宴招待。王蔚及其丈夫赵磊回中国了,我们就住在她家。 只可惜北虹没能见着多年未见的小师妹了。

八月二十一日 ( 第十一天 )

在附近的 Canadian Tire 换机油,汽车由多伦多至此已跑了五千多公里。说好一个半小时后取。 过了一小时去看,汽车已被吊起,四个轮胎都卸下来了。 Surprise,一问,说是免费检查,其实是想 找生意。果然查出毛病,一是皮带有许多裂痕,二是后轮煞车皮有裂缝。结果是换了皮带,五分钟工夫。 前后总共 $97,感觉很不舒服,labour 费收得太离谱了。

在温哥华城里随便转转,虽然是上班时间,街上依旧是车多人多,且道路狭窄曲折,着实不爽。 让刚从大自然的怀抱中出来的我们深感厌烦。虽然客观上说,温哥华是座不错的城市,依山傍海, 树木多,道路高低起伏,跌宕有趣。著名的 Stanley 公园虽只经过时稍稍一瞥,亦发觉它人工修饰 太重,与想象中的森林公园不一码事儿,也就没有兴致进去一逛。再好的风景,只要人一多,嘈杂 热闹起来,便走味儿了。

下午洗了衣服,睡了一觉。晚上去王伟家吃饭,陈皓华过来,聊了一会儿。

八月二十二日 ( 第十二天 )

上午歇了半晌,也没有动力出去玩。歇着反而觉得累,这么呆着也没劲。不如提早出发吧。 去 Zellers 买了防晒油、眼药水、矿泉水、胶卷,回来后打电话告诉他们要走了。告别他们,我们 重又起程了,去落矶山脉。

天黑后,在 Shuswap Lake 旁露营。省立公园的 营地满了,住它对面的 Frank Campground 。 北虹在帐篷里用充气机给气垫床打气,马达轰鸣。我去 洗手间回来时,发现边上来了一对 老外情侣 ,打了个招呼正要走过,那家伙却问: "Generally will it run all night? " 手指我们的帐篷处,满脸担心。我哈哈大笑,回来告诉北虹,她也大笑不已。 Kevin借给我们的这 玩意儿真是太低效率了。

八月二十三日 ( 第十三天 )

落矶山脉在阿尔伯特省由连在一起的四个国家公园组成,最大的是 Banff,亦是加拿大的第一个国家公园, 其次是 Jasper,Yohoo 和 Kootenay。

我们一路开车直抵 Banff国家公园的 Lake Louise 的露营地, 登记了四天。另外买路钱每天得十元,比 起黄石来贵了些。扎营后已是下午五点半了,北虹说歇着吧,我说天色尚早,出去玩玩吧。于是去 周围的三个小湖转了转,我一路报怨,但觉湖水虽碧蓝但亦普通,山也嫌直露无味,不如黄石公园的 仙山让人神往。一宿无话。

Year 2000: Go West (2)




八月十五日 ( 第五天 )

前往 Black Hill。先去订好了露营地,是私营 (private)的,价格较贵但营地并不好。 按计划路线是 Needle Scenic Way, Mt. Rushmore (总统山 ) 和 Beautiful Rushmore Cave。 事后发现犯了个错误,搞错了总统山的位置,以为要去的 Needle Scenic Way 会路过,其实 不然。 Needle Scenic Way 风景一般,而路途迂曲,上下坡极多,费了不少时间。

总统山是此日行程的闪亮点。四位总统是华盛顿,杰克逊,罗斯福和林肯。罗斯福并非我原先 以为的二战时的那个罗斯福。雕刻家本打算刻到腰部,可未成人已逝,有一青铜头像,其儿 所刻,置于此供人凭吊。 Visit Center 中有些图片资料及电影,记录当年雕刻之艰辛过程。杰克逊本为左边第一个,后 因尺寸不够,炸去重刻于现位置。罗斯福带有一无框眼镜,雕刻家在其眼部下凿一浅痕,颇具 匠心。林肯是没有胡须的。

Rushmore Cave 景致一般,导游能言,一路喋休不已。

八月十六日 ( 第六天 )

向美国的第一个国家公园黄石公园前进, 途中顺路去了 Devils Tower。有一部关于外星人的影片 <<第三类接触>>曾在此拍摄,Devils Tower 也因而出名。 这是一个树根形山,当 年火山喷发后岩浆冷却所成。

Wyoming 州立在高速公路旁的广告牌是 "like no place on Earth"。是极! 路旁全是一个个牧场。畜牧业看来是此州之主要产业。山峦起伏,一些山裸露处呈红色。公路 某些路段由红石子铺筑,如暗红色地毯。而山则常如马马虎虎刮过胡子的一张脸,被刮过的部 分是草皮,未刮到的则是树林子。

由90号高速公路拐入十四号风景路去黄石,路经 TenSheep Canyon。雄伟高大的群山让人震撼。 据说此处原有大角羊,现已灭绝。路上人烟稀少,经过的最小镇仅有十个人。 晚上抵达Cody小镇,牛仔们随处可见,只是开车代替骑马了。此处距黄石公园仅一小时路程, 我们选择在此安营扎寨。但露营地与以前不同,周围全是公路,麦当劳 、Burger King 等快餐 店就在边上,车辆轰鸣,感觉就象是露宿街头。我们就这么居于闹市中,一夜未休息好。 夜空中挂着一轮圆圆的红月亮,通红通红的,以前从未见过。这个州什么都是红的,居然连 月亮都是红色的了。

八月十七日 ( 第七天 )

恰逢修路,前进缓慢。到达黄石公园东门已是十一点多了,大门极为朴素,与想象中的大不相同。 开到 "大峡谷 "(Grand Canyon)订了露营地,位置极好,周围尽是高直的松树,搭好帐篷,北虹言道这真 像是个森林小屋。

黄石公园并非象国内的公园一样,可走着玩的。它的范围很广,且处于 Idaho(爱达荷 ), Wyoming (怀俄明 ),Montana(蒙大拿 )三州交界处,共有东、南、西、北、东北五个门。其风景点散布于上、 下两圈中,上圈长 80英里,以 Grand Canyon(大峡谷 )和 Mammoth Hot Spring (巨型温泉 )著称,下圈长 100英里,有以 Old Faithful Geyser(老实泉 )为代表的各个 Gayser Basin (喷泉流域 )及 Yellow Stone Lake(黄石湖 )。

下午就在周围的 Grand Canyon玩儿。有两道瀑布 Upper Fall和 Lower Fall在 Yellow Stone River上。 最精采之处当是在 Artist Point,可欣赏对面山崖之五彩斑斓及 Upper Fall,据说是由于泉水蒸气中的 化学成分长期侵蚀岩石而形成的不同颜色,远远望去,象是山水国画,退晕自然,实乃美仑美奂, 世间无匹。在 Red Rock Trail (红岩小径) 往下走至山谷低处欣赏 Lower Fall。北虹着高跟拖鞋, 下坡时 步履笨拙,老外见之皆曰 "Be careful",上山时却是健步如飞。

回到露营地,意外地发现邻居亦是中国人,两口子和父母,湖南人,从 Colorado (科罗拉多)州来的,很 热情。一路直至黄石公园,我们还未遇上中国人,老黑亦极少,全为白人,与多伦多种族混居大为不同。 半夜极冷。明月高悬于林梢,宁静的山中之夜。

八月十八日 ( 第八天 )

起得很早,改变了计划,决定先去玩下圈。路中两边森林多为枯木残骸,缘于多年前一场森林大火的 肆虐。黄石公园地壳薄弱,地热从此而出。各个 Basin 地上沸腾的泉水,就跟开了锅似的。空中水雾 弥漫,散布着硫磺味。

行进之间,乌云密布,急风骤雨,很是不幸。冒雨玩了 Fountain Paint Pots (彩罐泉)。这是 Lower Geyser Basin (下喷泉流域 ),远远望之水汽腾腾达数十米高,如数处起硝烟。乱拍了些照片,想今天 算倒霉了,看阴霾密布,一时半会儿是散不去了,只有继续前往 Upper Geyser Basin (上喷泉流域 )。 我们直奔黄石公园的代表老实泉 (Old Faithful Geyser),此喷泉因老实而得名,喷发间隔规律。游客 中心每日预报当日喷发时间。正巧 12:30附近有次喷发。数百名游客们静悄悄的立于雨中等待,耐心的 看着小山丘上喷泉处冒出的水汽。但喷发时却是令人失望的短暂,亦不高,游客们纷纷散去。说明上 说可高达三十多米,长至五、六分钟。

吃过午饭,天却放晴了。还是在老实泉附近逗留,沿着栈道观赏了些小泉水。有一泉名为 "Blue Star Spring" (蓝星泉),宝石般晶莹透明深邃平静。另一印象较深的小泉名为 "Chinese Spring" (瓷器泉), 不知因何得名,象一锅沸腾的开水,涌起的水泡宛如数百碎钻石,亦拍照留念。

回首却见老实泉处又是静悄悄的几簇人群,许多摄像机、照相机在阳光下闪烁,想必是又到了喷发时间。 果然它小喷了几下,又没了动静,等待片刻,便起步走到跟前。忽然喷了,这回甚是畅快,一次比一次高, 水汽弥漫,颇为壮观,足有五分钟,高达三十米。我连按快门四五下。看完老实泉一转身,忽见远处一 不定时的喷泉开始喷发了,旁边一老外激动的说 "我已等了它六小时了 "。此泉喷发时间极长, 直到我们 离开还没有结束。

快到黄石湖 (Yellow Stone Lake)处,有一泉水名为 "West Thumb Geyser", 形状为标准圆且极大,颜色 湛蓝,水雾浓重,恍若漫步于仙境,北虹留下一张胖仙女照。身边碰巧有一对身着婚纱礼服的新婚伴侣 携手走过云间。

黄石湖无甚特别,于是折回营地。没想到途中又是不同风光,夕阳笼罩着的广阔草原上,无数水牛 (buffalo) 或立或卧,吃喝玩乐,甚是快活,象一副美丽的风景画,其中有种原始的东西令人感动。一些水牛横穿 公路,旁若无人。众人纷纷停车,或观赏或拍照。

晚上有了准备,穿着棉坎肩和裤子睡觉,仍觉寒冷,温度估计在零度左右,桌上的毛巾都冻住了,我们 卷缩成一团睡觉。

八月十九日 ( 第九天 )

上午游上圈的 Mammoth Hot Spring (巨型温泉 ),有许多个非常庞大的 terrace,呈白色或橙色,远看象雪山。 那是泉水常年喷涌留下的沉积物,变成梯田状的石灰岩。

至此黄石公园的五大景点全部游览完毕,由最近的北门出去。从 89号公路重新回 到90号高速公路继续前进。 随即进入蒙大拿州,往日牛仔们在此纵马驰骋,风景壮阔,人烟稀少。半山腰稀疏有些房屋,里头住的应 都是牧场主了,与中国的农民不可同类而言。路边可见机械灌溉设备,长长的一排水龙,还带有轮子可 随处跑动。想他们住在这大山之中,养这许多牛马,拥有这大片牧场,每日观云起云落,似是极为惬意的 生活。比起我们这些住在喧嚣都市中,关在冷气空调大厦的某个 cubicle 里写 code 的人来说,幸福多了。

高速公路的出口大多是 "No service",没有任何服务 (加油站、快餐厅、旅馆等 ),真是荒凉的一个州。 公营的露营地不知为何都关了,扑了两个空。天已渐黑,只好折回头去找了个私营的营地, $18.9,此行 中最贵的一个,不过有厨房。这个营地满山遍野有许多肥肥的兔子和坑坑凹凹的兔子洞。

Year 2000: Go West (1)



前言

开车横跨北美曾是我的一个小小梦想。自我们拥有了一辆日本老车 (87年的Camry)后,慢慢有 了成为现实的可能。这个夏天我们计划去落矶山脉度假,北虹在我的鼓动下以及比较研究了坐 飞机、火车、汽车的价格后,毅然同意开车旅行,并且一路露营睡帐篷,既省钱又快活。

我们确定了旅游路线,走美国的九十号州际公路。虽绕路,但一路上还可玩总统山、 Badlands、 黄石公园。而加拿大并无真正的横穿全国的高速公路,一号公路虽号称 trans-Canada, 但在中部 草原省份只有两条车道且有红绿灯。 我们购置了装备 ,有帐篷、气垫床、露营灯、冷藏食物箱等等;从 CAA搞来一大摞免费地图和各州省 旅游、露营资料;检修了汽车;申请了 VISA 信用卡,银两充足。一切 就绪。 北虹具有德国人般的精确与高效率,擅长组织计划。因此,路上的大小琐细事务均由她负责管理,另外, 她还须一路看各种地图。北虹激动得一个月来天天做 Homework,阅读研究旅行资料并制定了详细计划。

周围的朋友们都认为这是趟疯狂且危险之行。因为其一,十三年的老车;其二,无手提电话;其三,无预定 住宿。再加上刚拿到驾照半年的我,能否安全归来真是可疑。

在一个夏日的下午,我们身骑丰田老铁马,腰跨尼康相机,开始了二十二天的北美之旅 。。。

八月十一日 ( 第一天 )

下午3:30接北虹下班,带的东西多,车装了很久。 五时终于出发了,高速公路 401交通堵塞, 慢慢挪了半小时,忽听北虹惊叫一声,方便面忘了带。三箱方便面是我们此次出行的口粮,我们 准备一路上中午吃高速公路边上的快餐 (麦当劳之类),晚上自己煮面条吃。不得已只好回去。六 时重又出发。沿 401往西行进,意气飞扬,长风浩荡。只是夕阳将落,不知晚上将栖何处,加上 饥肠辘辘,心中不安。

九时在麦当劳用毕晚饭,天就黑下来了。又开了一会儿到达小镇 Rodney,这是我们计划中的第一 站,仍在安省。有一个湖边公园露营地,可去 CAA时忘了要安省露营地手册 (其它州省都有 ),也就无法 查出此露营地的详细地址。找了一圈没有找着。这小镇极其安静,就一条主道穿过,不多的几个 商店都已关门,街上亦无行人。真是安静得让人害怕,北虹更是激动得语无伦次,说是不是今晚 就露宿街头了。

终于找了个人问路。到达后,又有人带去找公园管理人员。 他住在一个林间小屋里,林风徐徐,透过 大玻璃窗可见他歪在沙发上睡着了,电视还开着。敲了很久才把他搞醒。 登记了个帐篷地,是在湖边,已十点多了。这是个很大的公园,很多 RV(房车)和cottage(小木屋), 篝火几处,有人在篝火旁低声的聊天,很安静。

湖风凛冽,一轮明月高悬,照着浩淼的水面。在车灯和我们带的露营灯下扎好帐篷,洗漱整理, 打好气垫床,一切就绪已凌晨一时了。晚上风大,附近有异物哗啦啦作响,极象有人从帐篷旁走过, 常从梦中惊醒。

八月十二日 ( 第二天 )


早晨醒来,仍感困倦,发现晚上之怪物原是一面国旗。并无预想的房车纷纷离去的喧哗,发现 离开的只有我们两个,而住在此处大多为安度晚年的老头老太,一个小木屋的墙边立着这样一个 牌子,"Two Proud Grand Parent Living Here"。离开时惊讶地发现小镇的行人们也大多是老人 们。想来他们的孩子们定是去大城市发财去了,整个小镇便沦为一个大的养老院。

在Windsor(温莎)市过了Ambassador Bridge(大使桥),一座巨大的悬索桥,就到了美国海关。平生 第一次踏上美利坚合众国的国土,真让人激动。

Detroit(底特律)过后,由于修路,遇上严重的交通堵塞。烈日骄阳下,车流缓缓移动,极是痛苦。 中间出去在 Pizza Hut(必胜客)用过午饭。之后过了 Michigan (密西根)州,又穿过 Indiana (印第 安纳)州,进入 Illinoise(伊利诺)州。此州让人印象不佳,收费公路极多,开十分钟左右就得留下 买路钱 40美分,收费分自动和手工两种。自动收费并非象想象中的投币孔,而是个很大的铁漏斗, 从车中把硬币投进漏斗,便可通过。此地属于中部时区 (Central Time Zone),与属于东部时区 (Eastern Time Zone)的多伦多已有一小时时差。

今天的路线是此行中最复杂的一段,经由 96号-->80号-->294号-->94号-->90号。在 Algoquim小镇 的Buffalo 公园露营,旁边有 Fox River(狐狸河),卫生条件不佳,但有水有电,煮了面条吃。 树林子的清新空气,与草丛中虫子的呢哝,让我睡得很沉。而北虹四时后就醒来东张西望,担心 隔壁的篝火会不会烧过来之类的问题。而半夜下了场雨我也不知晓,一场好觉。

八月十三日 ( 第三天 )

早晨突来一场急雨,待雨稍歇,即冒雨收拾了帐篷用具,上车逃窜。可这实为开车最愉快的 一天,因是阴天。一路青山隐隐,疾风猎猎。过了伊利诺州,进入 Wisconsin(威斯康辛 )州, 而后到达了Minnesota (明尼苏达)州。这是个草原地区,但刚进入时让人眼前一亮,州际公路 90号旁左侧现出几座山,而右侧则为美丽的密西西比河,依山伴水,清风凉爽,让人精神顿长。 但随后便现出了它的草原面目。平阔开朗,一片茫茫的土黄,一条笔直的公路向前,脖子发酸, 猛踩油门,时速达 140公里。这日共开了九百余公里。

露营地也是在个极具草原特色的公园, Luverne小镇的 Blue Mound Park,乃州立公园。传说中平原 印第安人曾利用此处的悬崖猎杀水牛,作为过冬的食物,崖下余下一堆堆水牛骸骨。露营地 有水有电,还可洗澡,舒舒服服洗了个热水澡。

半夜似听到远处呜呜的狼嗥声,此起彼伏。睡得依旧香甜,北虹也睡得很好。

八月十四日 ( 第四天 )

开了一会儿即进入 South Dakota (南达科他)州,一路不是一望无际的庄稼便是些牲口,仍具草原情景。 在出口 191进入山地时区 (Mountain Time Zone),与多伦多已有二小时时差。

在 Burger King用过午餐,出来即惑热浪袭人。在北美开车旅行,早晨得抹上防晒油,因为 紫外线强,容易灼伤皮肤。而晚上到达露营地,又得喷上防蚊油,草地蚊虫多。北虹又涂 玉兰油,几乎每日三油上身,颇不容易。 另外,我们开车时解困的三大法宝,一是 涂清凉油;二是高唱革命歌曲,其中以 <<黄河大合唱 >>和<<国歌>>最为提神;实在不行就 爬下高速公路打个盹。

下午到达计划中的第一个风景点 Badlands,确实是名符其实。荒脊的石山,烈日如火。 如果说我们这次是西行取经,那这就是我们经过的火焰山了。口渴至极,拼命喝水亦无济。 Badlands Wall长达五、六十英里,驱车其上便可纵览其独特风光。每隔一定路程便有一 观景台,可停车观览及拍照。山皆荒脊,寸草不生,平时呈土黄色,无甚稀奇。但在夕阳 辉映下,由橙黄色至鲜红以至暗红,随光线之不同而变颜色,实为神奇。这儿曾被美国 摄影师学会评为是 "世界上最佳的日出、日落所在 "。更有某些山,天然有竖状条纹,颜色 由鲜黄至红色退晕,如艺术画作,据介绍说是五、六千万年前,此处曾为海湾,留下的 痕迹。沧海桑田,令人一叹。

百年前,曾有大批垦荒者到此垦荒,却因土地的贫脊及气候的恶劣,年年申请贫穷补助, 后纷纷离去。

露营地在一片荒原上,野餐桌上的遮棚造型独特,和谐融于荒原。薄暮时的景像让人想起 <<苔丝 >>,夕阳西下而圆月东升于地平线上。半夜刮起大风,帐篷摇晃。听到隔邻在打桩, 想是帐篷倒了。

Sunday, April 8, 2007

HttpClient for Form Based Authentication

There are 3 HTTP requests: 1st one to visit the protected pages defined by security-constraint in web.xml and obtain JSESSIONID, this is becasue we cannot access to j_security_check directly; 2nd one to post j_security_check for authentication; 3rd one resubmit the original request. The subsequent requests in the same session will be authenticated automatically. The Key point is that the 3rd one must resubmit the exact same original request. This is because the state is kept in server and the following request (a redirect request) will be checked against it. The redirect is always a GET based on the LOCATION header value in the response (response code 302). So if you send POST request to a different URL in 3rd request, you maybe mysterously taken to a doGet() method instead although you issue a POST request, as what I observed in JBOSS environment. In Tomcat, the behaviour is different, it is treated as non-authenticated and taken to login page again. Also, keep in mind that redirect might result in previous POST data lost.


HttpClient client = new HttpClient();
GetMethod method = new GetMethod("http://localhost:8000/webTest/protected/securityTest.html");
int status = client.executeMethod(method); // 200, response with login page
method.releaseConnection();

PostMethod authPost = new PostMethod("http://localhost:8000/webTest/j_security_check");
// authPost.setFollowRedirects(false);
NameValuePair[] data = {
new NameValuePair("j_username", "tomcat"),
new NameValuePair("j_password", "tomcat")
};
authPost.setRequestBody(data);
status = client.executeMethod(authPost); // 302, redirect to original requested page
authPost.releaseConnection();

method = new GetMethod("http://localhost:8000/webTest/protected/securityTest.html");
client.executeMethod(method);
String response = method.getResponseBodyAsString();
method.releaseConnection();
System.out.println(response);