iOS5开发学习笔记(3)

经过一段时间的学习,基本掌握了简单的iPhone开发。

主要学习的控件有:

Tab Bar Controller, 类似app store应用里面,下面的tab切换按钮。可以修改图片,名称等属性。

Navigation Controller,常见的如通讯录的那个可以左右移动的控件,可以设置标题等属性。

Table View Controller,常用的以列表形式展示数据的控件,使用时需要指定数据源。

WebView,可以用来显示网页,本地html页面或html代码。

Button,Label,TextField,这个就不解释了。

DatePicker控件,可以选取时间和日期。

最后是基本的View空间,可以自定义各种控件的组合或者是作图等。

 

Notes:

1. Navigation Controller和Tab Bar Controller可以通过Editor->Embed In来直接加上

2.Controller和Controller以及View的控制流转,可以通过storyboard界面的control+拖动来直接连接

3.segue是新加入的特性,如2中描述的,可以更好,更简单地控制界面的流转

4.手势操作暂时是从代码给controller和view添加的,从storyboard来看,也可以直接从objects里面拖进去。

5.常用的手势(放大/缩小,旋转,移动)已经给定义好了,不需要自己获取手势操作的raw data。

6.作图的时候需要使用到context和一些C Struct定义的CGPoint等。

 

代码可以参见:https://github.com/yiguid/iHome

基本代码学习都是参照的公开课视频,老头讲课的内容,自己有一些发挥和修改。

iOS5开发学习笔记(2) – git

itunesU上面有隐藏课程,是网易公开课上面没有的,讲XCode和git的集成开发,很详细。

这次的笔记主要记录git和github的相关东西。

首先搜索了一些比较有用的博文教程:

使用github管理iOS分布式项目开发: http://www.cnblogs.com/516inc/archive/2012/03/28/2421492.html

git /github 使用方法小记: http://like-eagle.iteye.com/blog/1317009

使用git/github管理ios项目:http://blog.csdn.net/wangyuefenga/article/details/7460104

总的来说使用还是很简单的

在github上创建一个账户,机器中安装好git,就可以按上面的教程一步步走了。

特别是在XCode中,如果项目所在的文件夹使用git建立好了之后,是会自动识别的,然后就可以使用File里面的Source Control的功能了。

当然你也可以在创建项目的时候就勾选连接git或者直接从github上clone下来你的项目,在Organizer中有对应的Repository信息

其他的就大概跟常见的svn使用一样了。

基本的git命令主要有:

 

1.创建一个新的repository:

先在github上创建并写好相关名字,描述。

$cd ~/hello-world        //到hello-world目录

$git init                     //初始化

$git add .                   //把所有文件加入到索引(不想把所有文件加入,可以用gitignore或add 具体文件)

$git commit               //提交到本地仓库,然后会填写更新日志( -m “更新日志”也可)

$git remote add origin git@github.com:WadeLeng/hello-world.git        //增加到remote

$git push origin master    //push到github上

2.更新项目(新加了文件):

$cd ~/hello-world

$git add .                  //这样可以自动判断新加了哪些文件,或者手动加入文件名字

$git commit              //提交到本地仓库

$git push origin master    //不是新创建的,不用再add 到remote上了

3.更新项目(没新加文件,只有删除或者修改文件):

$cd ~/hello-world

$git commit -a          //记录删除或修改了哪些文件

$git push origin master  //提交到github

4.忽略一些文件,比如*.o等:

$cd ~/hello-world

$vim .gitignore     //把文件类型加入到.gitignore中,保存

然后就可以git add . 能自动过滤这种文件

5.clone代码到本地:

$git clone git@github.com:WadeLeng/hello-world.git

假如本地已经存在了代码,而仓库里有更新,把更改的合并到本地的项目:

$git fetch origin    //获取远程更新

$git merge origin/master //把更新的内容合并到本地分支

6.撤销

$git reset

7.删除

$git rm  * // 不是用rm

//——————————常见错误———————————–

1.$ git remote add origin git@github.com:WadeLeng/hello-world.git

 

 错误提示:fatal: remote origin already exists.

 解决办法:$ git remote rm origin

 然后在执行:$ git remote add origin git@github.com:WadeLeng/hello-world.git 就不会报错误了

 2. $ git push origin master

 错误提示:error:failed to push som refs to

 解决办法:$ git pull origin master //先把远程服务器github上面的文件拉先来,再push 上去。

iOS5开发学习笔记(1)

有时间又来继续学习iOS开发了,这下iOS6的beta出来之后,xcode也都升级到4.2了,使用的是iOS5的SDK。

和之前相比,比较明显的变化是增加了storyboard和更好的内存管理机制。storyboard让我们可以对界面的构建有更好的体验,将不同的view组织得更加可视化。内存管理机制的完善,在写代码的时候就不需要手动管理内存,计数,release,autorelease,dealloc什么的了,都会帮你自动完成,这是一个很好的地方。而且他也不同于java的内存回收机制(随机检测是否有未再使用的内存),自动引用计数完成之后马上销毁。

网上关于iOS5开发的教程很少,资料和书也比较少,特别是对新特性的介绍(storyboard和优化后的内存管理机制)。网易公开课中有一个比较新的公开课程,叫《斯坦福大学公开课:iPad和iPhone应用开发(iOS5)》的是比较不错的一个视频课程,我刚看到了第三课。

到目前为止,学到的东西主要是基础的一些介绍,框架的简要说明。 第二课中教授演示了大概1个小时的如何创建一个简单的逆波兰计算器。第三课主要是讲一些Object-C语言特性和Foundation Framework。

开始学iOS开发,首先看了一下《Objective-C基础教程》,这是一本对这个新的,比较诡异的语言的入门好书

之后当然是构建开发环境,包括xcode的安装,破解,iPhone的越狱,然后这样我们就可以在不加入开发者计划的情况下进行真机调试了。具体的方法网上有很多就不粘过来了。

发现上面说了很多,还没有提到笔记的事情……

==================================================================

1.增加了weak和strong,是比较重要的东西

2.两种@标签property和synthesize的组合使用

3.no more : release,autorelease,dealloc

4.storyboard的使用学习,拖拽生成代码

5.学习了view和tableview的使用

6.延迟初始化的方法

7.结合sqlite3的使用 — 编写了一个简易的待办事项工具

8.多个按钮可以采用同一action,需要更改id类型来指定sender类型 — 编写了一个简易的计算器

9.NSString, NSNumber,NSLog等的基础使用。

 

网上资料比较少,欢迎大家来一起讨论~

堆和栈的区别

今天主任面试,问到了C/C++中动态分配/释放内存的问题。

乍一看,就是malloc/free和new/delete的问题,但是实际上涉及到的知识还比较多。

另外还有程序结构和,堆和栈的区别问题,于是搜到了下面这篇文章,学习一下

继续阅读“堆和栈的区别”

各种游记

发现自己越来越懒了,好多最近的旅行都没有游记了……

=================我是分割线====================

大四毕业旅行:五人海南行

报团旅行,从长沙双飞,到海南的时候那感觉一个high啊,完全就是异域风情,椰风下的夜晚,月明星稀,几个人坐着一个海南人开的小面包车一路中国乡村重金属音乐,永远忘不了那种感觉。

看到了金色的沙滩和碧蓝的大海,也吃到了很可怕的九菜一汤……还见到了奢华的亚龙湾和各种海啊各种海

在海口的黑泥步行街买吃的,住偏远的三亚宾馆,好不容易找到一个小超市。

参观了植物园,天涯海角,巧克力厂,珍珠项链神马的

=================我也是分割线====================

研一清明节:八人上海&杭州行

动车直达上海噢,全程自助,大牛推荐的格林豪泰宾馆还是不错的。见到了传说中的摩都上海。老街和浦东差别好大呀,杜莎夫人蜡像馆很有意思。第三天高铁往返杭州,看到了西湖和雷峰塔,还有那幽静的青年旅社,真是很有意思。还见到了猴崽和hanbo童鞋,在东方明珠上眺望了整个上海,果然还是摩都。

东方明珠上那个透明的观景区很有意思噢

冻得要死……哈哈

=================我还是分割线====================

研一端午节:四人青岛行

又是一次冻得要死的经历,主要还是吃海鲜,天桥宾馆不咋地啊

海鲜和啤酒太给力了,给力都要进医院了……肚子那个疼啊

各种冷,各种吹风,青岛的海还是一般般啦

喝啤酒可以选择去青岛,崂山还不错

=================我是分割线====================

研二国庆节:五人坝上行

依然很冻,见到了金色的坝上。全部是荒草连天的景色,蒙古包,一望无际的大漠,让人视野和心胸都变得开阔了。

路途好遥远呀,北京北站火车到四合永,坐小巴到围场县城。住了一晚坐大巴到塞罕坝,又包车到机械林场,然后机械林场又可以继续往森林的深处走……

一望无际的森林,骑马和军马场的坑爹的马

期待着下次春夏的再去~

=================我也是分割线====================

研二三月初:双人香港行

北京直飞香港,由于有了前几次的经历,这次带足了衣服,发现最后竟然可以穿短袖了,不过这次是一次成功的旅行。

到香港后买了八达通确实很好用呀,直奔海洋公园,坐的是海洋公园专线,不过竟然联通186不能用,买了个香港的卡。

海洋公园档次还是很高的,比北京的要稍微好一些,不过其实主要是游乐园啦,缆车确实很恐怖呀。

导游人很nice,由于我们有旅游券,所以一开始和最后都是自由行,增加了这次旅行的乐趣。

第一天晚上还去维多利亚港看了紫荆花,挺漂亮的。晚上住的是旺角的一个居民楼,那房子叫一个可怕,估计不到10平米吧,竟然是上下铺的床。

第二天各种购物,真的是购物游啊,难怪是0团费,之前还参观了黄大仙庙,参拜了十二生肖守护神,哈哈。

从导游口中得知了很多香港的秘密呀,太平山那雾也太大了吧……还有邪¥&*@(教……囧

购物时间太长了,什么钻石,黄金啊,手表呀,化妆品啊,其实他们带去的地方并不是最好的地方吧。晚上夜游维多利亚港,那根本没游到吧。。。

晚上住在青衣的宾馆,那才是真正的宾馆啊,泪流满面……晚上又两个人坐小巴坐地铁跑出来玩,跑到中环就困得不行了,又跑回去睡觉了。那天晚上住的是海景房啊海景房啊有木有!!!

第三天早早起来就坐船去澳门了,一个小时就到了,看了妈祖庙,有大陆信号噢,大三巴教堂和在澳门小街里面穿行,参观了所谓的小赌场,大赌场是下午去的,下午我们就自由行了……

和严厉且认真的导游告别之后开始了之后的自由行阶段,竟然箱子拖坏了……

坐船回香港的时候还怕不让进关了肿么办,还好还好。

回去后到尖沙咀的大牛帮订的宾馆住下了,叫stanford山景宾馆,山景算不上,不过还真是在山上。

自由行啦,看到了各种奢华的奢侈品店啊,一条街就有几家LV,爱马仕,GUCCI啊有木有,LV就想班尼路一样频繁啊有木有,各种大款啊有木有。穿梭在香港的城市中,有一种糜烂的感觉,而且两旁高楼林立,压的人有点透不过气。

还好天星小轮和夜晚的维港还是很给力的,那绚烂的摩天大楼的灯光,映射出每个人心中美好的事物。

第四天上午主要是到处跑买箱子啦,铜锣湾,尖沙咀各种购物中心,下午checkout之后就直接杀到机场免税店了,可惜好买的东西不多。晚上顺利坐上灰机,回到了温暖(大误,其实天气很寒冷)的北京。

不得不说香港的奢华和真实的居民楼对比太强烈了

香港的吃的还挺好吃的

有钱人的天堂啊

=================我竟然还是分割线====================

真是无良驴客啊无良驴客。。。竟然这么多游记都没有写

更多旅游感想补充中……

灵媒苏小小

    【魔王重生】小编遇上大美女,怎料美女不是人。昔日情人下毒手,美女前来救小编。好奇终究害死猫,误打误撞放魔王。前世恩怨由此起,待听猫猫且来叙。
【穿越千年】苏小小失踪,小编且心急,唤来旧日友,再把美女寻,黑猫误乱阵,木子穿千年,往事再重现,纠结在此卷。
【修炼西游】玉帝再给机会,四人结成团队,重现西游又记,修炼魔身为人。

 

点击阅读灵媒苏小小   http://www.qdmm.com/MMWeb/2106599.aspx

灵媒苏小小最新章节试阅

    1.
结草原本想去给郁子找药材,可是就碰巧遇到魇离,二人便打了起来。这正是朱雀王所见到的两道紫色的光芒。
现在三人又再次相遇,可是同往日却再也不同,很多东西都像冬天泼出去的水一样,收不回又擦不去,结成冰块,凝结在地面,成为永久的疤痕。
“日辰,好久不见。”魇离淡淡地说,就如他往日,不张扬却又不屑。
日辰点点头,道:“嗯,还是本王大婚之前见到的呢。”
魇离冷冷一笑,肩膀也随之抽动,说:“原本是你嫂子的人,如今却变成了我的弟妹,却是让人不悦,不过也不劳烦臣弟多次提醒。”
“少废话!”结草大吼一声就朝着魇离扑过去,两人又打作一团,化为两团紫色的光雾穿梭在朱雀皇宫内。
整个朱雀都充斥着浓烈的血腥味,尖叫哭嚎四起,杀戮遍地。朱雀军已经溃不成军,恶鬼像坏死的蛆虫向城外扩去,朱雀瞬间就成了人间地狱。
皇宫里横七竖八歪斜着宫女和侍者的尸体,他们都像被蚕食的树叶一般,到处都是窟窿,这些恶鬼很是贪婪,并不把一个人吃完,他们有的只吃了脑袋,有的只是吃了腿脚,更有恶心的专门挑着肝脏吃,被吃了肝脏的人的腹部都有一个大窟窿。
朱雀王抬起脚,就会有粘稠的血液黏在脚底,让人的行动都变得缓慢。他的脸色越来越难看,就像是被镀上了一层铅一样,这是他整个家族多年的心血,却就在他的手里毁……

回顾2011,展望2012

2011年从无尽的考试开始,一直考到了1月19号。各种本科学过的东西,再次进行了复习,算法,数理逻辑,马克思。

1月20号的时候实验室聚餐了,破天荒发了很多购书卡,不知道今年实验室还有没有聚餐呢?

然后就是回家过年,各种节日和生日了。3月的时候存了第一笔钱。

3月又开始了网络实验,模式识别等课程。

4月的时候去玉渊潭终于看到了樱花

清明节一行人上海,杭州几日游,见到了猴崽

端午节继续游青岛,吃了好多海鲜,喝了好多啤酒,肚子都疼。

7月结束了公司的工作,开始给百度投简历

7月底回了一趟家,因为境要去美国了。

7-10月在百度实习,境在美国。

7月还有熊老师的视频课录制,9月还有开学典礼,9月底的时候回去参加了表哥的婚礼

国庆节几个人去了坝上,虽然很冷,但是风景还不错。

11月境回来了,吃了好多米粉

开始频繁的往中办跑……

12月搬家到了校内,准备去香港,办通行证发现黑户了两年,囧

12月参加了好多表彰大会

圣诞节去欢乐谷玩了,之后是在培训楼的跨年,可惜没有湖南卫视的跨年演唱会看。

=================跨年分割线==============================

2012年的愿望:

身体健康,天天开心

去香港看看

继续旅游计划

*****和*****

发个论文,开个会什么的

中办继续,人搜实个习什么的

答个好辩,找个好工作~

世界未末日~

大家好,才是真的好~

 

 

梦想

梦想是什么?

小时候,梦想就是能够买到一把塑料子弹手枪,能够和小伙伴们一起在草丛里,花园里进行激烈的枪战。梦想就是能够拥有自己的四驱车,能够改装得很好;能够有自己的”秘密基地“,可以一群人一起做饭吃,烤红薯。这些梦想现在想想,都实现了,所以小时候应该是没有什么遗憾了。如果说找一点遗憾的事情的话,就是小时候没有能够学得一门特长,其实自己挺喜欢画画和音乐的,还好,还能唱唱歌。

开始读书了,梦想就是能够学习更多的知识,当一名科学家,能够去清华北大看看是什么样子。知识是学了很多,也算是一名伪科学家了,但是离那种可以解剖小动物,乱捣鼓一些草药混在一起,燃烧各种东西的机会已经越来越少了。现在能做的一些事情,也就是过年的时候可以和弟弟妹妹们一起在堤边放一把小火,然后围在一起转,放放鞭炮。清华北大倒是会经常路过,经常进去,但是毕竟还是没有在里面学习,这不能不说算是一点小小的遗憾吧。其实追其原因,还是因为自己当年决心不够。

进入大学,随着人越来越长大,想法也就越来越多,有的同学梦想能够出国,有的梦想有一场轰轰烈烈的大学爱情。我的梦想?我记得刚进大学的时候,我在班委上任演讲后唱了《最初的梦想》,我觉得人最难坚持的就是自己最初的梦想吧。还好,往回看,自己经历的许多许多事情,实现了自己在进大学的时候给自己设定的目标。

长大了,身边的同学,朋友也都有了自己的选择,有继续读研的,有工作的,有出国的,大家都在各自的人生道路上前行,朝着梦想而走。我也是一样,没有一刻停下自己的脚步。现在的梦想,就是有一个安定的家庭,有自己的事业,和真真正正的去环游世界,有事没事闲着偷乐。

行走得太匆忙,就会忘记回味一些事情,就像忙着旅行和工作,忘记了整理之后的照片一样,这样会错过很多精彩的东西。到了今天,我的梦想清单中,是一些什么呢?那么就问问自己。

你的梦想又是什么呢?

Liferay、Zimbra和Processmaker与CAS的单点登陆集成

一.搭建CAS服务器

1.1 CAS下载 http://downloads.jasig.org/

推荐搭建在独立的服务器上

启用Tomcat SSL

编辑 $LIFERAY_HOME/conf/server.xml,反注释SSL配置段,如下:

1.2 使用JDK工具keytool生成SSL证书

在任何目录(我在HOME)下使用命令:

keytool -genkey -alias tomcat -keypass changeit -keyalg RSA

将生成.keystore在$HOME下。
注意:在输入What is your first and last name? 时请使用你的hostname(参考/etc/hosts文件),不要用IP。或者使用hostname命令查看
整个过程如下:

daniel@daniel-desktop:~$ keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: daniel-desktop
What is the name of your organizational unit?
[Unknown]: SEE
What is the name of your organization?
[Unknown]: Jinfonet
What is the name of your City or Locality?
[Unknown]: Kunming
What is the name of your State or Province?
[Unknown]: Yunnan
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=daniel-desktop, OU=SEE, O=Jinfonet, L=Kunming, ST=Yunnan, C=CN correct?
[no]: yes

从keystore中导出证书并将此证书导入到JRE中:

daniel@daniel-desktop:~$ keytool -export -alias tomcat -keypass changeit -file server.cert

这个server.cert以后还会用到,下面的这个导入方法适用于使用的是系统的jre的情况下,下面会介绍其他的情况
daniel@daniel-desktop:~$ keytool -import -alias tomcat -file server.cert -keypass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts

测试SSL连接

访问https://daniel-desktop:8443/cas 成功

1.3 CAS登录验证

在CAS的验证页面,使用test作为帐号,test作为密码(只要帐号==密码就可以了),测试一下能不能通过CAS的验证。结果应该是可以通过,但是跳转也没无任何显示。因为我们并没有真正通过我们的帐号验证。其实CAS也是可以和ldap或者mysql集成的,请参考其他资料 =)

二. Liferay与CAS的单点登陆集成

Liferay的设置相对比较简单,只需要使用之前的server.cert,并导入到自己的jre中的cacerts文件即可,注意网上下载的liferay都是自带jre的。

之后需要往lib中加入cas-client-3.2.0-release包。

然后打开web页面,已管理员账户登陆liferay,选择顶部:管理-控制面板-门户-设置-认证-开启CAS,填写相关的CAS服务器地址,注意不能使用localhost或ip,必须要主机名或者域名

之后可以测试点击主页面的登陆和登出,都会跳转到CAS的认证页面。

三. Zimbra与CAS的单点登陆集成

CAS( Central Authentication Service)是由JA-SIG开发的一套开源的单点登录系统,在教育行业有着非常广泛的应用,有不少企业也在使用它。CAS的特点是安全性非常高,可维护性高。下面详细描述一下如何实现ZCS与CAS的集成。

1.配置ZCS的CACert keystore

在zimbra用户下执行以下脚本,将CAS的服务器证书(证书或证书链)导入到ZCS的CACert keystore中:

/opt/zimbra/java/bin/keytool -import -file casserver.cert -alias cascert -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit
/opt/zimbra/java/bin/keytool -import -file casserver.chain -alias caschain -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit

复制代码

2.部署CAS客户端

[li]从http://www.ja-sig.org/downloads/cas-clients/下载客户端软件包。3.1.x版本的客户端可以与ZCS 6.0.x、CAS服务器. 3.3.x一起工作。[/li][li]复制cas-client-core-3.1.x.jar文件到/opt/zimbra/jetty/common/lib目录。
[/li]

3.修改ZCS的配置文件

3.1 zimbra应用

将下列代码加入到/opt/zimbra/jetty/etc/zimbra.web.xml文件中,插入位置应在前(约230行),然后替换cas.url.com:port和 zimbra.url.com:port。
默认的端口:CAS为8443,ZCS为443或80。


CasSingleSignOutFilter
org.jasig.cas.client.session.SingleSignOutFilter


CasSingleSignOutFilter
/*

org.jasig.cas.client.session.SingleSignOutHttpSessionListener


CasAuthenticationFilter
org.jasig.cas.client.authentication.AuthenticationFilter
casServerLoginUrl https://cas.url.com:port/cas/login
serverName https://zimbra.url.com:port


CasAuthenticationFilter
/public/preauth.jsp


CasValidationFilter
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
casServerUrlPrefix https://cas.url.com:port/cas
serverName https://zimbra.url.com:port
redirectAfterValidation true


CasValidationFilter
/*


CasHttpServletRequestWrapperFilter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter


CasHttpServletRequestWrapperFilter
/*

复制代码

3.2 zimbraAdmin应用

针对/opt/zimbra/jetty/etc/zimbraAdmin.web.xml文件进行同上一步的操作(插入内容、替换关键字)。
ZCS管理控制台的默认端口是7071。

4.建立PreAuth键

在zimbra用户身份下执行以下脚本:
[pre]

zmprov gdpak yourdomain.com

复制代码

[/pre]将会得到这样的PreAuth键值: “359d722926fc3daebd0fee5d8b9dad9bbe1646e68041afa8ab662c6a9152e6b9″。

5.建立preauth.jsp文件

5.1 zimbra应用

[li]将附件(附件为ZIP压缩文件,请将扩展名由GIF改为ZIP后打开)中的preauth.jsp-zimbra复制为: /opt/zimbra/jetty/webapps/zimbra/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第90处的domainname.com[/li]

5.2 zimbraAdmin应用

[li]将 preauth.jsp-zimbraadmin复制为: /opt/zimbra/jetty/webapps/zimbraAdmin/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第92处的domainname.com[/li]

6.替换登录和注销URL

以zimbra用户身份执行以下脚本,替换ZCS默认的登录和注销URL:
[pre]

zmprov md yourdomain.com zimbraWebClientLoginURL https://zimbra.url.com:port/zimbra/public/preauth.jsp
zmprov md yourdomain.com zimbraWebClientLogoutURL https://cas.url.com:port/cas/logout
zmprov md yourdomain.com zimbraAdminConsoleLoginURL https://zimbra.url.com:port/zimbraAdmin/public/preauth.jsp
zmprov md yourdomain.com zimbraAdminConsoleLogoutURL https://cas.url.com:port/cas/logout

复制代码

实践证明,使用zmprov mcf zimbraWebClientLogoutURL http://www.monSiteAuth.com 更好

默认端口同前。
7.重启ZCS

以zimbra身份运行zmcontrol restart命令重启ZCS服务。

四. Processmaker与CAS的单点登陆集成

1. upload the CAS Client library to the /opt/processmaker/gulliver/thirdparty

2. modify /opt/processmaker/workflow/engine/methods/login/authentication.php code as below

add CAS method

At #26 to #40.

Code: Select all
require_once ‘CAS-1.0.1/CAS.php’; //这里要写自己的版本号
// initialize phpCAS
phpCAS::client(CAS_VERSION_2_0,’oa.cybercloud.com’,8443,); //这里要写自己的CAS服务器地址和端口

// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();

// force CAS authentication
phpCAS::forceAuthentication();

if( phpCAS::isAuthenticated() == true )$casAuth = CASAuthIsTrue;

$_POST[‘form’][‘USR_USERNAME’] = phpCAS::getUser();
$_POST[‘form’][‘USR_PASSWORD’] = $casAuth;

3. modify /opt/processmaker/rbac/engine/classes/model/RbacUsers.php

change password check to CAS auth check. This is a tricky method. I use “password” as check CAS Authenticated or not. But I think this is not a good way. 😛

At line #71 & #72.
// if ( $aFields[‘USR_PASSWORD’] == md5 ($sPassword ) || ‘md5:’.$aFields[‘USR_PASSWORD’] === $sPassword) {
if ( $sPassword == CASAuthIsTrue) {

4. add javascript to submit form

/opt/processmaker/workflow/engine/xmlform/login/login.xml

在最后几行加入
document.login.submit();

五.Q&A

基本完成了CAS的单点集成登陆。

其他的一些问题:

1.出现如下异常:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这是缺少安全证书时出现的异常,解决方案就是将你要访问的webservice的安全认证证书导入到客户端即可。以下是获取安全证书的一种方法

1,写一个程序专门获取安全证书,参考InstallCert.java

2.执行 java InstallCert hostname 比如

java InstallCert 192.168.1.137:8443

会看到如下信息:

java InstallCert ecc.fedora.redhat.com Loading KeyStore /usr/jdk/instances/jdk1.5.0/jre/lib/security/cacerts… Opening connection to ecc.fedora.redhat.com:443… Starting SSL handshake…

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038) at InstallCert.main(InstallCert.java:63) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839) … 7 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216) … 13 more

Server sent 2 certificate(s):

1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US

Issuer CN=Certificate Shack, O=example.com, C=US
sha1 2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7
md5 dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54

2 Subject CN=Certificate Shack, O=example.com, C=US

Issuer CN=Certificate Shack, O=example.com, C=US
sha1 fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6
md5 72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68

Enter certificate to add to trusted keystore or ‘q’ to quit: [1] 3.输入1,然后直接回车,会在相应的目录下产生一个名为‘jssecacerts’的证书。将证书copy到$JAVA_HOME/jre/lib/security目录下,或者通过以下方式

System.setProperty(“javax.net.ssl.trustStore”, “D:\UTA\DOC_E_Health_XML\Keystore\jssecacerts

Zimbra cacerts证书坏了之后,可以暂停了服务之后重新签发证书

用root执行

/opt/zimbra/bin/zmcertmgr createca -new

/opt/zimbra/bin/zmcertmgr deployca

/opt/zimbra/bin/zmcertmgr createcrt -new -days 7300

/opt/zimbra/bin/zmcertmgr deploycrt self

/opt/zimbra/bin/zmcertmgr viewdeployedcrt

六. 参考资料

InstallCert.java

Preauth.jsp-zimbra

Preauth.jsp-zimbraAdmin

Liferay 5.1.1 安装与整合CAS
http://blog.csdn.net/DL88250/archive/2008/08/20/2802525.aspx

ZCS与CAS(Central Authentication Service)单点登录系统的集成
http://opengeek.cn/thread-151-1-1.html

ProcessMaker与CAS集成 http://forum.processmaker.com/viewtopic.php?f=9&t=930

使用 CAS 在 Tomcat 中实现单点登录 http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
【原创】CAS调研总结 http://www.iteye.com/topic/544899

ZCS证书的重新签发 http://opengeek.cn/thread-492-1-1.html

常见编码转换

写JSP的时候经常会遇到各种编码问题,真的是程序员一大头疼问题。

最近又解决了一个编码问题,编码问题从Eclipse的编码,tomcat的编码,到jsp页面的编码都需要调整。

常见的编码解决办法有几种:设置tomcat的编码,设置jsp页面的编码和在servlet中强制转换编码。

由于有时候出现的问题,不知道到底是何种编码,需要转换成什么编码才能正确显示,于是写了下面一个小工具,可以用来进行几种编码的转换。

通过使用这个工具,可以将“测试”从UTF-8编码转换成GBK编码的“娴嬭瘯”,然后再转换回UFT-8的“测试”二字。

检测出Eclipse默认的GBK编码出现的问题~ 修改就好了~

 

附代码:

package util;
import java.io.UnsupportedEncodingException;
public class CharsetConvertor {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String oldStr = "测试";
        String tmp;
        String[] code = { "utf8", "gb2312", "ISO8859_1", "unicode", "gbk" };
        for (int i = 0; i < code.length; i++) {
            for (int j = code.length – 1; j >= 0; j–) {
                tmp = new String(oldStr.getBytes(code[i]), code[j]);
                System.out.println((oldStr + " : " + code[i] + " to " + code[j] + " : " + tmp);
                System.out.println(tmp + " : " + code[j] + " to " + code[i]
                        + " : " + new String(tmp.getBytes(code[j]), code[i]));
                System.out.println("========================================");
            }
        }
    }
}