跨HTTP重定向传递数据的选项

时间:2012-05-04 20:34:29

标签: java http response.redirect post-redirect-get http-redirect

我正在处理Web应用程序,需要跨HTTP重定向传递数据。例如:

http://foo.com/form.html 

发布到

http://foo.com/form/submit.html

如果数据存在问题,则会将响应重定向回

http://foo.com/form.html?error=Some+error+message

,查询参数“error”的值显示在页面上。

是否有其他可靠的方法可以跨重定向传递数据(即HTTP标头等)。

将数据作为查询参数传递有效但不理想,因为:

  • 它的明文(在查询字符串中,所以SSL不能依赖于encyrpt)所以我不想传递敏感数据
  • 浏览器的URI长度有限(albiet,长度通常相当长)。

重要提示:此平台是无状态的,并且分布在许多应用服务器上,因此我无法跟踪服务器端会话对象中的数据。

3 个答案:

答案 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保护的)。