在URL哈希/片段中存储JSON的最佳实践

时间:2011-03-15 23:48:14

标签: ajax json ria state-management

我正在构建一个单页面的AJAX应用程序,并希望在某些情况下在URL哈希(#)之后将状态存储在JSON中。我已经看到其他几个网站都这样做了,但我希望在我努力实现这一目标的过程中获得一些最佳实践,技巧或陷阱。

2 个答案:

答案 0 :(得分:7)

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

作为更好的选择,我建议使用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];
  }
}

答案 1 :(得分:3)

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

实施例。来源JSON:

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

实施例。以URL编码:

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

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