在 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 未在请求标头中设置引用者
如何在 ajax POST 请求中设置标头以包含 CSRF 令牌
在 Spring Reactive 中使用 application.properties 在请求标头中设置 Content-type