9

我编写了一个 RESTful Web 服务,它只被设备使用,而不是浏览器。这些设备通过所有者现有的家用路由器访问互联网,并通过每隔 30 秒通过路由器发送 HTTP 请求来与 Web 服务通信。这些请求主要是“轮询”请求,以查看 Web 服务是否有设备的任何新信息。

我想防止任何 ISP 透明代理拦截请求并返回缓存的响应。我已经读过这样做的一种方法是将随机查询字符串附加到请求的 URL 的末尾,以欺骗代理认为这是一个唯一的请求。例如:

http://webservicedomain.com/poll/?randomNumber=384389

我有能力做到这一点,但这是最好的方法吗?有点像黑客。

4

3 回答 3

15

您应该使用HTTP 的 Cache-Control 标头来实现这一点。

在回复中,您应该发送:

Cache-Control: private, must-revalidate, max-age=0
  • private - 表示响应消息的全部或部分是针对单个用户的,并且不能由共享缓存缓存。
  • max-age=0 - 表示客户端愿意接受年龄不大于 0 秒的响应。即响应立即过时。
  • must-revalidate - 当缓存接收到的响应中出现时,该缓存在它变得陈旧后不得使用该条目来响应后续请求,而无需首先使用原始服务器重新验证它。

您还应该为传统的 HTTP/1.0 中间服务器发送一个Pragma 标头:

Pragma: no-cache

相关阅读:

于 2012-08-04T13:40:01.840 回答
1

您可以尝试使用加密连接。我认为缓存代理不应该存储来自加密通信的响应。

一种解决方案可能是在您的服务器上配置 HTTPS,另一种可能是将客户端配置为使用SSL 代理之一向您的 HTTP 服务器发送请求。

于 2012-08-02T13:32:44.807 回答
1

当然,使用适当的 Cache-control 和其他标头,使用 POST 和瞧!这可以解决你所说的问题。

你可能想看这个——关于缓存的讨论

然后也可以避免额外的参数传递。

于 2012-08-04T13:34:40.497 回答