2013-03-27 34 views
1

我正在用Node.js,Express和MongoDB構建博客。Node.js/Express:防止直接從URL加載AJAX HTML片段

在主頁上我有一個按鈕來加載更多的職位。這工作得很好,我用下面的代碼完成它:

jQuery的

$("#load-more-posts").click(function() { 
    $.ajax({ 
     url: '/load/posts/', 
     type: 'get', 
     dataType: 'html', 
     success: function(data) { 
      $("#primary").append(data); 
     }, 
     data: {"passLastDate": lastDate} 
    }); 

    return false; 
}); 

下面是路線app.js

app.get("/load/posts", routes.loadPosts); 

而這裏的觀點:

loadPosts: function(req, res) { 
    var lastDate; 
    lastDate = req.query.passLastDate; 
    return Post.find({ 
    "published": true, 
    "publish_date": { 
     $lt: lastDate 
    } 
    }).sort('-publish_date').limit(1).execFind(function(err, posts) { 
    if (posts === []) { 
     console.log("thats it"); 
     return res.render("thats-it", { 
     layout: false 
     }); 
    } else { 
     lastDate = posts.slice(-1)[0].publish_date; 
     return res.render("more-posts", { 
     layout: false, 
     posts: posts, 
     lastDate: lastDate 
     }); 
    } 
    }); 
} 

就像我說的,這一切都很好。但是,如果我從控制檯複製GET url並直接粘貼到瀏覽器中,我會得到一個返回的HTML片段。我想這是應該的,但我不想退還。我不認爲這是一個安全隱患,只是看起來有點不雅。

有沒有辦法阻止對此視圖的直接請求?

BONUS

這裏是別的東西很奇怪,並且使這是一個問題兩個部分。當我在if語句中檢查空的post數組時,Node會忽略它。控制檯輸出顯示posts = []但它跳過它,然後在lastDate = posts.slice(-1)[0].publish_date;lastDate = posts.slice(-1)[0].publish_date;我知道JS的行爲有趣的空值(空,未定義,空字符串等),但我已經嘗試了不同的結果相同的結果。它似乎完全忽略它。我正在服用瘋狂的藥丸嗎?

回答

4

有沒有辦法阻止對此視圖的直接請求?

你可以檢查,看看是否是由對x-requested-with頭檢查(其中jQuery的一起發送)使用AJAX調用執行的請求:

loadPosts: function(req, res) { 
    if (req.headers['x-requested-with'] === 'XMLHttpRequest') { 
    // AJAX request 
    } 
    else { 
    // not an AJAX request 
    } 
} 

這不應該被用作安全措施(因爲不是),而只是作爲檢查請求是否使用AJAX進行的一種方式。

至於你的其他問題,[] === []實際上是錯誤的(因爲是[] == []),所以這不是一個很好的方式來查看一個數組是否爲空。我建議你使用:

if (!posts || posts.length === 0) { 
    // empty 
} 
+0

這兩個工作,謝謝! – 2013-03-27 15:31:58

1

您可以使用會話(在主頁面中初始化)來保護您的片段。
在路徑前添加中間件到中間件,中間件會檢查會話令牌並在沒有找到會話時重定向。
與登錄時受到數據保護的系統幾乎相同,並且每個用戶的主頁都會自動登錄。

我可以爲你取一些例子,如果你需要的話留下評論。

[BONUS]

你試過 posts == []posts.length === 0,而不是posts === []

+0

你必須使用'posts.length === 0','posts == []'不起作用。謝謝! – 2013-03-27 15:32:56