2006-11-08 09:42:39 / 个人分类:Discuz研究
上周末在家两天用.NET给我老婆的Discuz论坛增加了一个个性签名的功能,现在把我的一些系统整合的心得跟大家分享一下。
先看这张示意图
绘图7.gif
1.在Discuz根目录下面增加了一个bbsign.php页面,在templates的模版目录里面增加了bbsign.htm.
bbsign.php里面没有什么内容,只是通过 include template('bbsign');去调用bbsign.htm显示页面内容而已。
在bbsign.htm里面包含了 {template header}和 {template footer} ,这是Discuz通用的头部和页脚文件,使用通用header和footer的好处就是只需要维护一份代码,修改header或者footer后所有页面的页头和页脚都会修改过来。
2.在bbsign.htm嵌入IFrame
在bbsign.htm里面有了头和尾当然还需要页面内容,我使用了一个IFrame放在{template header}和{template footer}中间, 来嵌入.NET系统开发的Code.aspx页面。iframe是一个子窗体,和当前页面基本上是独立的。
<iframe width="1000" height="1300" src="bbsign/Code.aspx?MemberID=$discuz_uid& Password=$discuz_pw" frameborder="0" style="margin:0px;padding:0px;"></iframe>
src的值就是子窗体要显示的页面地址,frameborder="0" ,就是把子窗体的边框宽度变成0,这样子窗体和主页面就融合在一起看不出来了。
当然你也可以用Frameset框架页面来实现这个功能,做成一个头,中,尾三部分的框架页面。
3.传入Discuz系统的用户信息
对个性签名系统来说,只需要知道当前用户的ID编号就行了,因为不同用户的个性签名不同,每个签名都会有不同的用户编号来标识。
怎样来得到Discuz系统的用户编号呢?大家可以看到我在上面IFrame的 src="bbsign/Code.aspx?MemberID=$discuz_uid& Password=$discuz_pw"里面写了,$discuz_uid是Discuz系统变量,记录了当前用户的编号,通过这个src就把当前用户的编号传给.NET系统的Code.aspx了。
但是问题产生了,如果只传编号进去,我怎么知道这个编号就一定是Discuz系统的合法用户呢?所以在src里面必须加上Password=$discuz_pw,这样把加密的密码也一起传给了Code.aspx,这样.NET系统通过用户和密码就能判断了。
备注:在页面后面加?带上几个参数(QueryString)是WEB应用程序最常用的传递参数的方法,因为我们每访问一次页面就是一个http请求,Http请求是无状态的,所以需要通过一些手段来保存或传递一些状态,QueryString就是其中一种方法。
4.Code.aspx的用户验证
Code.aspx接收到传过来的用户编号和密码参数后,当然对这些参数要过滤一下SQL非法字符,防止有人进行SQL注射,然后通过MySQL.Data.dll去调用MySQL数据库,取出里面加密的密码,然后将用户ID和密码一起比较,如果都一致,说明这个用户合法,可以继续操作,否则提示用户是非法用户,需要登陆。这个密码是md5加密的,非对称加密是不可逆的,最常用的加密方法,虽然md5早被破解了,但密码复杂一点,基本上还是很难破解,所以大家把密码设复杂一点,不用担心密码被破解。
因为我的系统和论坛是在一起的,所以使用了直接访问MYSQL数据的方法,而且我的.NET系统用到的数据表也是存在Discuz论坛数据库里的。如果不在同一服务器上,不知道Discuz数据库的密码,或者没法远程连接Discuz数据库,那就只能使用Discuz论坛提供的passportAPI了,这是现在一些流行的BBS系统通用的做法,提供了访问论坛系统用户数据的应用程序接口,这样就不用访问数据库了,直接调用数据接口就可以了。
Discuz论坛提供的passportAPI我还没有使用过,不过估计看过使用说明,应该不难用。现在.NET系统和Java系统与异构系统最常用的做法是使用WebService来传递两个系统间的数据。
感谢大家耐心看完,写得可能不是很清晰,望谅解,谢谢!
下一篇我会写一下我的这个.NET个性签名系统的系统架构。
先看这张示意图
绘图7.gif
1.在Discuz根目录下面增加了一个bbsign.php页面,在templates的模版目录里面增加了bbsign.htm.
bbsign.php里面没有什么内容,只是通过 include template('bbsign');去调用bbsign.htm显示页面内容而已。
在bbsign.htm里面包含了 {template header}和 {template footer} ,这是Discuz通用的头部和页脚文件,使用通用header和footer的好处就是只需要维护一份代码,修改header或者footer后所有页面的页头和页脚都会修改过来。
2.在bbsign.htm嵌入IFrame
在bbsign.htm里面有了头和尾当然还需要页面内容,我使用了一个IFrame放在{template header}和{template footer}中间, 来嵌入.NET系统开发的Code.aspx页面。iframe是一个子窗体,和当前页面基本上是独立的。
<iframe width="1000" height="1300" src="bbsign/Code.aspx?MemberID=$discuz_uid& Password=$discuz_pw" frameborder="0" style="margin:0px;padding:0px;"></iframe>
src的值就是子窗体要显示的页面地址,frameborder="0" ,就是把子窗体的边框宽度变成0,这样子窗体和主页面就融合在一起看不出来了。
当然你也可以用Frameset框架页面来实现这个功能,做成一个头,中,尾三部分的框架页面。
3.传入Discuz系统的用户信息
对个性签名系统来说,只需要知道当前用户的ID编号就行了,因为不同用户的个性签名不同,每个签名都会有不同的用户编号来标识。
怎样来得到Discuz系统的用户编号呢?大家可以看到我在上面IFrame的 src="bbsign/Code.aspx?MemberID=$discuz_uid& Password=$discuz_pw"里面写了,$discuz_uid是Discuz系统变量,记录了当前用户的编号,通过这个src就把当前用户的编号传给.NET系统的Code.aspx了。
但是问题产生了,如果只传编号进去,我怎么知道这个编号就一定是Discuz系统的合法用户呢?所以在src里面必须加上Password=$discuz_pw,这样把加密的密码也一起传给了Code.aspx,这样.NET系统通过用户和密码就能判断了。
备注:在页面后面加?带上几个参数(QueryString)是WEB应用程序最常用的传递参数的方法,因为我们每访问一次页面就是一个http请求,Http请求是无状态的,所以需要通过一些手段来保存或传递一些状态,QueryString就是其中一种方法。
4.Code.aspx的用户验证
Code.aspx接收到传过来的用户编号和密码参数后,当然对这些参数要过滤一下SQL非法字符,防止有人进行SQL注射,然后通过MySQL.Data.dll去调用MySQL数据库,取出里面加密的密码,然后将用户ID和密码一起比较,如果都一致,说明这个用户合法,可以继续操作,否则提示用户是非法用户,需要登陆。这个密码是md5加密的,非对称加密是不可逆的,最常用的加密方法,虽然md5早被破解了,但密码复杂一点,基本上还是很难破解,所以大家把密码设复杂一点,不用担心密码被破解。
因为我的系统和论坛是在一起的,所以使用了直接访问MYSQL数据的方法,而且我的.NET系统用到的数据表也是存在Discuz论坛数据库里的。如果不在同一服务器上,不知道Discuz数据库的密码,或者没法远程连接Discuz数据库,那就只能使用Discuz论坛提供的passportAPI了,这是现在一些流行的BBS系统通用的做法,提供了访问论坛系统用户数据的应用程序接口,这样就不用访问数据库了,直接调用数据接口就可以了。
Discuz论坛提供的passportAPI我还没有使用过,不过估计看过使用说明,应该不难用。现在.NET系统和Java系统与异构系统最常用的做法是使用WebService来传递两个系统间的数据。
感谢大家耐心看完,写得可能不是很清晰,望谅解,谢谢!
下一篇我会写一下我的这个.NET个性签名系统的系统架构。