这一节我们来看一下DOTTEXT的TRACKBACK流程。
首先我们来看一下是怎么发送TRACKBACK的:入口是Dottext.Framework.EntryHandling.Process
- 检查文章内容中是否已经包含了远程网页的链接,只有包含才能继续
- 从远程链接的网页下载HTML代码,如果没得到,说明不是合法链接,要返回
- 在得到的HTML代码中检查是否已经包含了本文的链接,有说明已经PING过了,要返回
- 在得到的HTML代码中根据TRACKBACK标准取到要TRACKBACK链接(链接包含在RDF为键值的被注释的XHTML代码中),从而完成了由网页链接到TRACKBACK链接的转化
- 发送(PING)TRACKBACK。
再来看一下接收TRACKBACK的流程,入口是:Dottext.Framework.Tracking.TrackBackHandler.ProcessRequest
- 根据PING过来的TRACKBACK链接得到本地文章的ID号,得不到则不是合法链接,要返回
- REQUEST方法是否是POST,不是要返回,这是TRACKBACK标准规定的。
- 根据ID号从库中检索数据,生成ENTRY对象
- 根据传过来的URL下载远程网页的HTML代码,如果没得到或得到的HTML中没有包含本地文章的链接,说明不是合法链接,要返回
- 从得到的HTML代码中分析出对方的页面标题,如果没有,要返回
- 生成一个新的ENTRY对象,并对其各个属性赋值,然后入库
由此我们看到DOTTEXT发送TRACKBACK时效率是比较低的。原因是需要去下载远程的HTML,这将是一个非常耗时的工作,更不用说还要从很可能十分庞大的HTML代码中提取出TRACKBACK链接。
再者就是接收TRACKBACK时,并没有建立屏蔽机制。从而无法避免垃极广告的侵袭,也就是我们所说的SPAM COMMENT。
我想要解决这些问题,需要改变发送TRACKBACK的发送机制。
- 不再根据TRACKBACK标准去自动获取TRACKBACK,这样不仅效率极低,而且很多网站并不支持这个标准(比如www.blogchinese.com就直接提供引用通告,而不是隐藏在网页中,哈哈)的话,就无法TRACKBACK成功了。我们就认为用户输入的就是合法的TRACKBACK链接。直接进行发送。
- 为了能让用户得到合法的TRACKBACK地址,在每一篇文章内容之后,都显示此文的TRACKBACK链接。
- 再提供一个页面,输入网页链接,就能显示出此网页的TRACKBACK链接,以继续支持那些符合标准的网站
在接收TRACKBACK时,我们相应做以下改动:
- 将对方URL拿到库里去验证,看对方是否已经PING过了,因为是在本地进行,速度会非常快。
- 在库中建立BLACKIP表,对来方的IP进行校验,这样就拥有了封对方IP的功能。
以上只是我的设想,因为时间的原因,还没有动手去实现,如果大家有更好的建议,可以一起来探讨。