我正在处理Web应用程序,需要跨HTTP重定向传递数据。例如:
http://foo.com/form.html
发布到
http://foo.com/form/submit.html
如果数据存在问题,则会将响应重定向回
http://foo.com/form.html?error=Some+error+message
,查询参数“error”的值显示在页面上。
是否有其他可靠的方法可以跨重定向传递数据(即HTTP标头等)。
将数据作为查询参数传递有效但不理想,因为:
重要提示:此平台是无状态的,并且分布在许多应用服务器上,因此我无法跟踪服务器端会话对象中的数据。
答案 0 :(得分:1)
我认为使用Cookie是一种合理的解决方案,具体取决于数据量。因为你无法在服务器端跟踪它(例如,通过使用会话,这会更简单)
答案 1 :(得分:1)
您可以将错误消息存储在服务器上的数据库中,并通过id:
引用它 http://foo.com/form.html?error_id=42
如果修正了错误文本,您甚至不需要使用数据库。
此外,您可以使用Web Storage。您可以使用此JavaScript显示输出页面,而不是使用“Location”标题重定向:
var error_message = "Something is wrong";
if( typeof(Storage) !== "undefined" ) {
localStorage.error_message = error_message;
else {
// fallback for IE < 8
alert(error_message);
}
location.href = "new url";
重定向后,您可以使用JavaScript阅读localStorage.error_message
并显示消息。
答案 2 :(得分:1)
从客户端 - 服务器交互的角度来看,这是服务器内部调度问题。
浏览器并不意味着根据the HTTP specification自动重新发布初始请求的实体:“所需的操作可以由用户代理执行,而不与用户交互,当且仅当第二个请求中使用的方法是GET或HEAD。“
如果不是这种情况,请将form.html
设置为动态,以便它是HTML静态文件。将POST
请求发送给自己,并在出错时预先填写值。或者,如果出现问题,您可以submit.html
使用与form.html
相同的模板。
它的明文(在查询字符串中,因此SSL无法依赖 encyrpt)所以我不想传递敏感数据
我不确定这里的问题是什么。无论如何,你通过普通的HTTP提交所有内容。 Cookie,查询参数和请求实体都将可见。使用HTTPS would actually protect all this,虽然查询参数仍然是浏览器历史记录和服务器日志的问题(这不是连接的一部分,这是TLS保护的)。