在 URL 中设置请求标头?

Posted

技术标签:

【中文标题】在 URL 中设置请求标头?【英文标题】:Setting request header, in a URL? 【发布时间】:2014-10-28 13:16:35 【问题描述】:

我们有一个主要用于通过 jquery 的 $.ajax() 从 javascript 调用的 web 服务。当我们从 javascript 调用方法时,我们在请求标头中设置了一个安全令牌。如果它不存在,或者它没有验证,我们会返回一个未经授权的错误。

这一切都很好。

但现在我们面临着返回图像文件的问题。因此,我们没有让 javascript 调用 $.ajax(),而是在 DOM 中嵌入了一个图像标签:

<img src='http://mywebservice/imagescontroller/getAnImage?imageid=123'/>

当我们这样做时,我们的请求标头中没有我们的安全令牌。我可以想到两个“简单”的修复。 1.,我们只允许匿名访问我们的图像 URL,或者 2.,我们将安全令牌作为 URL 参数传递。

当然,第一个选择不是一个好主意。第二个足够简单。但在我决定采用这种方法之前,我想知道是否有一些简单的方法可以在这类请求上设置请求标头,而我错过了。

想法?

【问题讨论】:

你可以使用AJAX获取图片数据,然后在image.src中放一个data:base64,... URL。 这是一个有趣的想法。 【参考方案1】:

简单修复:使用会话 cookie。那是一个没有有效期的cookie。它会随着每个请求自动传输,并在用户关闭浏览器或您通过 javascript 删除 cookie 时立即消失。

您只需将您的令牌存储在那里并免费将其交付给您的服务器代码。

这里有一些演示内容: How do I set/unset cookie with jQuery?

如果您在另一个域上运行服务,则需要使用 CORS 来使 AJAX 运行 - 否则您的 AJAX 将运行到同源策略中。使用 CORS,您甚至可以使 cookie 工作。

请看这里:CORS request - why are the cookies not sent?

如果您不想使用 CORS,您还可以通过反向代理将服务域合并到您自己的域中。这将解决 SOP 问题,并使 cookie 的使用成为可能。在 Apache 中设置反向代理非常简单。

【讨论】:

Cookies 在浏览器和为页面提供服务的服务器之间来回传递。我们的网络服务位于一个单独的站点上。 你知道你会遇到AJAX的同源策略吗?也就是说,除非您使用 CORS 来修复它。如果你必须使用 CORS,你也可以获取 cookie:***.com/questions/8863571/… 或者你可以用老式的方式来做,通过反向代理在你的主域的某个路径下隐藏另一个域。假设“domain.com/services/*”被反向代理为“otherdomain.com/bla”。这样既不会发生 SOP,Cookie 也不会出现任何问题。

以上是关于在 URL 中设置请求标头?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript window.location 未在请求标头中设置引用者

无法在 Fetch Get 请求中设置任何标头

在groovy post请求中设置标头

如何在 ajax POST 请求中设置标头以包含 CSRF 令牌

在 Spring Reactive 中使用 application.properties 在请求标头中设置 Content-type

在 Spring Boot 中设置响应头