javascript - 区分用户请求和 AJAX/资源请求

标签 javascript node.js http http-headers

我正在尝试使用 Node.js 创建一个应用程序(使用 http.createServer()),它将是一个单页应用程序,通过 XMLHttpRequest 请求数据。为此,我需要能够区分导航到我的域的用户、AJAX 请求以及浏览器生成的链接资源请求。

如果请求来自用户,我总是希望返回 index.html 页面来处理请求内容,但如果请求是浏览器生成的或 AJAX 并且是针对 CSS、Javascript 或其他链接的文件 我想为这些文件提供服务。有什么办法可以检测到吗?

查看不同文件类型的请求 header ,我看到页面生成内容请求时出现了 referer header 。我认为这就是我正在寻找的解决方案,但是当用户单击页面链接时也会设置该标题,使其毫无用处。

唯一发生变化的事情是 accept header ,它可以工作,但可能不是一个包罗万象的解决方案。无论输入哪个 url,任何用户请求似乎总是将 text/html 作为首选返回类型。我可以检测到这一点,但我很确定对 html 文件的 AJAX 请求也会有 accept header ,这会导致问题。

这里有我遗漏的东西吗(我可以查找的任何标题或属性)?

<小时/>

编辑:我不需要保护文件的解决方案,并且我不关心用户通过自己的请求绕过它。我的目的不是隐藏文件或确保文件安全,而是将请求的任何数据保留在应用程序范围内。

例如,如果用户导航到 http://example.com/images/someimage.jpg,他们会看到 index.html 文件,然后该文件可以在更丰富的上下文中显示图像,并包含与其配套的所有链接和功能。

TL/DR:我需要检测某人何时尝试访问该应用程序,然后为他们提供索引页面,并向他们发送他们想要的内容。我还需要检测浏览器何时请求应用程序所需的资源(JS、CSS、HTML、图像等),以便能够实际返回资源而不是索引文件。

最佳答案

就 HTTP 协议(protocol)而言,用户生成的查询浏览器生成的查询之间没有区别。

每个查询都只是...一个查询。 您可以使用命令行、浏览器进行查询,您可以单击链接,通过 telnet 发送一些 ASCII 文本,请求代理来为您进行查询,服务器的目标永远不会识别查询是如何请求的由用户。

例如,请参阅用户在反向代理缓存上发出的请求,此查询永远不会到达您的服务器(响应来自缓存),构建此响应的第一个查询可能是由真实用户或通过浏览器。

就安全性而言,试图控制用户从不请求数据自己无法通过检测查询是否是真正的人为点击来完成(如果您想的话,可以在 google 中搜索点击劫持)害怕)。浏览器可以进行的每个查询也可以由用户执行,每一个查询,您都无法阻止。

一些浏览器插件甚至会在您自己执行之前进行预取、检测页面上的链接并发出请求(如果是 GET 查询)。

对于ajax,一些库(例如JQuery)会添加一个X-Requested-With: XMLHttpRequest header ,这在大多数框架上用于检测ajax模式。 但依赖位置策略会更强大(例如使用 /format/ajax 进行 ajax 查询,它也可以用于其他方式(例如 /format/json /format/html/format/csv)。

花时间在基于位置策略的路由上肯定更有用。

但是有一件事可以产生影响,POST 查询不是幂等的,这意味着浏览器无法在没有真正的用户交互的情况下进行 POST 查询,因为 POST 查询可能会改变 session 的状态或者服务器数据的状态(但是js可以进行POST查询,这只是浏览器的默认行为)。浏览器永远不会自动检索 POST 查询,因此您可以创建一个网站,其中所有用户交互都是 POST 查询(通过表单或通过一些 js 更改链接点击来发送 POST ajax 查询)。但我不是你真正的目标。

关于javascript - 区分用户请求和 AJAX/资源请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34722112/

相关文章:

javascript - 除非设置为可写,否则无法覆盖 readOnly 可配置函数值对象原型(prototype)属性

node.js - 使用 Playwright 制作 PDF 时控制页边距

javascript - 在模态窗口中显示 HTML 标记

javascript - 在客户端运行 runat=server

node.js - Node Http 服务器 - 请求收到两次

node.js - 在 Electron 应用中,使用 webpack/electron-builder 打包后,在 worker_threads 提示 MODULE_NOT_FOUND 中需要第三方模块

c# - 如何重定向 POST 表单提交,就像它最初提交到另一个页面一样?

PHP Curl 和 headers 问题

c# - 使用 WebClient.UploadString 的 HTTP 发布在发布到同一网络上的另一台机器时非常慢

javascript - Array.from方法中的第三个参数thisArg是什么