2011-03-15 74 views
4

我正在构建一个单页AJAX应用程序,并希望在某些情况下在URL哈希(#)之后在JSON中存储状态。我见过其他两个网站都这样做,但我希望在我实施这个过程中获得一些最佳实践,技巧或陷阱。在URL哈希/片段中存储JSON的最佳实践

+1

也许使用base64进行编码? – Valerij 2011-03-16 00:41:26

+0

其他网站似乎没有base64编码,但我不知道他们是否以某种方式限制了自己,否则兼容性或解析问题。 – DuckMaestro 2011-03-16 01:11:25

回答

3

说回回答我自己的问题 - 我可以证明,URL编码(甚至只是部分)JSON字符串在我们的生产环境中工作得非常好。

Ex。源JSON:

{"mode":21,"popup":18,"windowId":2} 

Ex。在URL中编码:

http://example.com/my-ajax-app#%7B%22mode%22:21,%22popup%22:18,%22windowId%22:2%7D 

对于少量的JSON如上,我们在任何浏览器(甚至可以追溯到IE7)都没有问题。我们还没有测试过更大的JSON字符串。

+0

+1我打算使用这种技术,谢谢分享你的经验 – Christophe 2012-09-29 02:27:15

+0

我不得不说,它看起来不漂亮。 – 2015-08-14 15:54:59

7

我实际上建议不要将数据封装到json中,然后将其放入哈希中。 原因是JSON本身需要大量标记,并且实际上会打开一些安全漏洞,因为您必须稍后评估直接来自用户的代码。

作为一个更好的选择,我会建议使用x-www-form-urlencoded作为封装。例如,如果这是你的状态对象:

var stateObject = { 
    userName: 'John Doe', 
    age: 31 
} 

然后,你将创建一个哈希代码是这样的:

// Create an array to build the output string. 
var hashPartBuffer = []; 
for (var k in stateObject) { 
    hashPartBuffer.push(
    encodeURIComponent(k), 
    '=', 
    encodeURIComponent(stateObject[k]), 
    '&'); 
} 
if (hashPartBuffer.length) { 
    // Remove the last element from the string buffer 
    // which is '&'. 
    hashPartBuffer.pop(); 
} 
var hashPartString = hashPartBuffer.join(''); 
// This will now be 'userName=John%20Doe&age=31' 

然后你会分析这个回来:

var hashPartString = 'userName=John%20Doe&age=31'; 
var pairs = hashPartString.split(/&/); 
var stateObject = {}; 
for (var i = 0; i < pairs.length; i++) { 
    var keyValue = pairs.split(/=/); 
    // Validate that this has the right structure. 
    if (keyValue.length == 2) { 
    stateObject[keyValue[0]] = keyValue[1]; 
    } 
} 
+0

感谢您的回答。不过,我使用旧版浏览器的流行json2.js库,以及新版浏览器上的本机JSON对象。所以就安全性而言,JSON对于我认为的课程来说是相同的。 – DuckMaestro 2011-03-19 03:31:56

+0

一个很好的答案,如果不适用于这种情况。荣誉Sorin! – rav 2011-07-15 15:59:14

+2

解码字符串的代码中的错字。而不是 'var keyValue = pairs.split(/ = /);' 应该是 'var keyValue = pairs [i] .split(/ = /);' – 2012-10-09 14:11:28