天天看點

[Debugging]分析部落格園送出評論的校驗規則

1

2

<code>//AddComment方法傳回的資訊</code>

<code>{</code><code>"d"</code><code>:{</code><code>"__type"</code><code>:</code><code>"BlogServer.Web.WS.ReturnValue"</code><code>,</code><code>"IsSuccess"</code><code>:</code><code>false</code><code>,</code><code>"CommentID"</code><code>:0,</code><code>"ReturnData"</code><code>:</code><code>"該評論已發表過!"</code><code>}}</code>

從頁面裡的PostNewComment()方法中這段代碼的注釋中:

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>$.ajax({</code>

<code>    </code><code>url:</code><code>'/ws/CommentService.asmx/AddComment'</code><code>,</code>

<code>    </code><code>data: $.toJSON(comment),</code>

<code>    </code><code>type:</code><code>"post"</code><code>,</code>

<code>    </code><code>dataType:</code><code>"json"</code><code>,</code>

<code>    </code><code>contentType:</code><code>"application/json; charset=utf8"</code><code>,</code>

<code>    </code><code>success:</code><code>function</code><code>(data) {</code>

<code>        </code><code>if</code> <code>(data.d) {</code>

<code>            </code><code>if</code><code>(data.d[</code><code>"IsSuccess"</code><code>]){</code>

<code>                </code><code>var</code> <code>dt = (</code><code>new</code> <code>Date()).getTime()-startDate;</code>

<code>                </code><code>ShowCommentMsg(</code><code>"感謝您的回複:)"</code> <code>+</code><code>" 送出耗時"</code><code>+dt+</code><code>"毫秒"</code><code>);                       </code>

<code>                </code><code>//RereshComments2(comment.parentId); </code>

<code>                </code><code>$(</code><code>"#tbCommentBody"</code><code>).val(</code><code>''</code><code>);</code>

<code>                </code><code>$(</code><code>"#divCommentShow"</code><code>).html($(</code><code>"#divCommentShow"</code><code>).html()+data.d[</code><code>"ReturnData"</code><code>]);                 </code>

<code>                </code><code>//$("#divCommentShow").html(data.d["ReturnData"]+content.replace(/\n/g,"&lt;br/&gt;")+"&lt;br/&gt;&lt;br/&gt;");                        </code>

<code>                </code><code>CommentNotify(data.d[</code><code>"CommentID"</code><code>]);                       </code>

<code>                </code><code>}</code><code>else</code><code>{</code>

<code>                </code><code>//就是在這裡給出的提示資訊</code>

<code>                </code><code>ShowCommentMsg(data.d[</code><code>"ReturnData"</code><code>]);</code>

<code>                </code><code>$(</code><code>"#span_comment_posted"</code><code>).html(</code><code>''</code><code>);                       </code>

<code>           </code><code>}</code>

可以發現,前面傳回資訊中的“IsSuccess”和“ReturnData”屬性決定了給出了這個提示。如此說來這似乎是部落格園在背景裡有意加入的一個限制,大概的邏輯好像是:不管是否同一篇文章,在一段時間内不能送出相同内容的評論。換句話說,即使相同内容的評論,在同一篇文章裡,隻要間隔時間足夠長,還是可以反複送出的。在相同文章裡,有下面這個限制:

<code>if</code><code>($(</code><code>"#span_comment_posted"</code><code>).html()!=</code><code>''</code> <code>&amp;&amp; $(</code><code>"#span_comment_posted"</code><code>).html()==content){</code>

<code>     </code><code>alert(</code><code>"該評論已發表過!"</code><code>);</code>

<code>    </code><code>return</code><code>;</code>

<code>} </code>

這段腳本決定了,對于同一篇文章,不能反複送出相同評論,但是這種邏輯不能阻止交替送出相同的評論。從為了防止惡意刷屏的角度來說,這個限制應該還算是比較合理的,隻是相同頁面已經有了alert("該評論已發表過!");限制,如果跨頁面送出相同評論的時候,這個提示資訊如果能改成"XXX秒内,不允許送出相同評論!"更直覺一點,不容易産生歧義。

綜合前面所有的分析,最後對部落格園的評論校驗規則的實作做個總結:

首先,會在用戶端通過比較span_comment_posted緩存的内容,判斷是否連續送出了相同評論,并直接在用戶端通過alert給出提示資訊,因為在重新整理頁面或切換到其他頁面以後span_comment_posted内容就沒意義了,是以這種校驗隻在相同頁面内且沒有人為重新整理過時有效。

其次,就是在背景的CommentService裡,限制在一段時間内(好像是60秒)不能連續送出相同的内容。這種方式比較可靠,不管是否重新整理頁面,是否跨頁面,都不會影響校驗規則。

最後,好像在CommentService裡還有一個連續送出多少次評論以後,就會提示"送出評論太頻繁!"的校驗,實作方式跟前者應該一樣。

總體感覺部落格園的校驗規則還是比較完善的,除了上面說過的提示不太準确,暫時沒有什麼好的意見,各位看客有什麼更好的意見,不妨說出來大家一起讨論。

本文轉自Justin部落格園部落格,原文連結:http://www.cnblogs.com/justinw/archive/2009/12/20/1628021.html,如需轉載請自行聯系原作者