我正在构建一个单页AJAX应用程序,并希望在某些情况下在URL哈希(#)之后在JSON中存储状态。我见过其他两个网站都这样做,但我希望在我实施这个过程中获得一些最佳实践,技巧或陷阱。在URL哈希/片段中存储JSON的最佳实践
回答
说回回答我自己的问题 - 我可以证明,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字符串。
+1我打算使用这种技术,谢谢分享你的经验 – Christophe 2012-09-29 02:27:15
我不得不说,它看起来不漂亮。 – 2015-08-14 15:54:59
我实际上建议不要将数据封装到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];
}
}
感谢您的回答。不过,我使用旧版浏览器的流行json2.js库,以及新版浏览器上的本机JSON对象。所以就安全性而言,JSON对于我认为的课程来说是相同的。 – DuckMaestro 2011-03-19 03:31:56
一个很好的答案,如果不适用于这种情况。荣誉Sorin! – rav 2011-07-15 15:59:14
解码字符串的代码中的错字。而不是 'var keyValue = pairs.split(/ = /);' 应该是 'var keyValue = pairs [i] .split(/ = /);' – 2012-10-09 14:11:28
- 1. 实施哈希的最佳实践?
- 2. 片段的最佳实践
- 3. 在DOM中存储JSON的最佳实践
- 4. Android活动和片段,最佳实践
- 5. 片段管理最佳实践多ListFragments
- 6. ASP.Net MVC存储CustomIdentity的最佳实践
- 7. 存储数据的最佳实践
- 8. 最佳实践将数据存储在本地存储中
- 9. 备份s3存储桶最佳实践
- 10. 常用存储库maven最佳实践
- 11. 最佳实践 - 存储过程记录
- 12. 存储库模式最佳实践
- 13. JSON安全最佳实践?
- 14. 在Azure表存储中存储实体指针(外键)的最佳实践
- 15. 如何在使用Shibboleth实施SSO的同时保存URL的哈希片段
- 16. 如何在哈希中存储哈希哈希?
- 17. 在Subversion中存储ASP.NET网站的最佳实践?
- 18. 在Windows Azure中存储密码的最佳实践
- 19. 在app.yaml中存储秘密的最佳实践
- 20. 将SQL域存储在SQL数据库中的最佳实践?
- 21. 在pom.xml中配置存储库vs settings.xml的最佳实践
- 22. 在源代码中存储敏感信息的最佳实践
- 23. 在asp.net中存储语言变量的最佳实践
- 24. 在PHP中存储全局数据的最佳实践?
- 25. 在iOS应用程序中存储数据的最佳实践?
- 26. 缓存 - 最佳实践
- 27. 缓存最佳实践
- 28. 用JavaScript存储哈希表的最佳方式
- 29. 在Couchbase中存储大对象 - 最佳实践?
- 30. 最佳实践如何在数据库列中存储HTML
也许使用base64进行编码? – Valerij 2011-03-16 00:41:26
其他网站似乎没有base64编码,但我不知道他们是否以某种方式限制了自己,否则兼容性或解析问题。 – DuckMaestro 2011-03-16 01:11:25