当前位置: 首页 > 面试题库 >

将Express.js 4的res.status(401)链接到重定向

夏侯俊美
2023-03-14
问题内容

如果请求用户未通过身份验证,我想发送401的响应代码,但是当请求是HTML请求时,我也想重定向。我发现Express 4不允许这样做:

res.status(401).redirect('/login')

有谁知道解决这个问题的方法吗?这可能不是Express的限制,因为我要求本质上传递两个标头,但是我不知道为什么会这样。我应该能够传递“未经身份验证”的响应,并一次性重定向用户。


问题答案:

发送新位置标头的方法存在一些细微的差异。

redirect

app.get('/foobar', function (req, res) {
  res.redirect(401, '/foo');
});
// Responds with
HTTP/1.1 401 Unauthorized
X-Powered-By: Express
Location: /foo
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 33
Date: Tue, 07 Apr 2015 01:25:17 GMT
Connection: keep-alive

Unauthorized. Redirecting to /foo

statuslocation

app.get('/foobar', function (req, res) {
  res.status(401).location('/foo').end();
});
// Responds with
HTTP/1.1 401 Unauthorized
X-Powered-By: Express
Location: /foo
Date: Tue, 07 Apr 2015 01:30:45 GMT
Connection: keep-alive
Transfer-Encoding: chunked

与原始(不正确)方法一起使用redirect

app.get('/foobar', function (req, res) {
  res.status(401).redirect('/foo')();
});
// Responds with 
HTTP/1.1 302 Moved Temporarily
X-Powered-By: Express
Location: /foo
Vary: Accept
Content-Type: text/plain; charset=utf-8
Content-Length: 38
Date: Tue, 07 Apr 2015 01:26:38 GMT
Connection: keep-alive

Moved Temporarily. Redirecting to /foo

因此,看起来redirect将放弃任何先前的状态代码并发送默认值(除非在方法调用中指定)。由于在Express中使用了中间件,因此很有意义。如果您有一些全局中间件对所有请求进行预检查(例如检查正确的接受标头等),它们将不知道如何重定向请求。但是,身份验证中间件将因此并且将知道可以覆盖任何先前的设置以正确设置它们。

更新:如下面的评论所述,即使Express可以发送带有Location标头的4XX状态代码,也不表示对于请求客户端根据规范理解,这是可接受的响应。实际上,除非状态代码是3XX值,否则大多数都会忽略Location标头。



 类似资料:
  • 我正在使用Java,我想向URL发送请求,然后获取重定向到的URL。 我想解决方案,如果它包括使用HttpClient和请求,因为我已经使用了过去。

  • 问题内容: 我正在尝试重定向我的响应,但是我被困在链接路径上。 以下命令将我带到tomcat的localhost并在此处搜索页面,但是按预期找不到任何内容。 为了解决此问题,我必须将我的根文件夹名称(来自webaps的名称)放在链接路径中,但是我认为这不是一个好主意。 为什么会这样呢?除了getRequestURL()或类似的方法,还有其他解决方法吗? 问题答案: 相对重定向URL相对于当前请求U

  • 问题内容: 我有一个已删除的文件,但仍保持打开程序的状态。我使用lsof找到了索引节点号。如何创建硬链接回到该索引节点? 任何代码都会有所帮助,但是Perl会很方便。 问题答案: 从/ proc / pid / fd / 文件描述符 复制 __ 使用lsof查找pid和文件描述符。

  • 背景: 我们目前正在建立一个定制的游戏商店。由于Android的游戏商店不托管此类应用程序,我们提供了一个带有“下载”按钮的网页,用户点击该按钮安装我们的apk。 问题: 我们想为这一点建立一个深层次的联系。如果用户点击此深度链接URL,如果安装了应用程序,它将打开应用程序。如果未安装应用程序,它将打开网页,您可以从中安装apk。 这能做到吗?

  • 我在JavaFX应用程序中使用MVP。 资源: 控制器: 看法 在我的InfoStageView中,只需初始化我的标签和样式我的视图。 如何将我的超链接绑定到我的标签。我尝试了一些方法,但没有成功。我的StringProperty不可点击,但很容易绑定。 我的目标:我想打开带有链接的浏览器。

  • 我试图找到一种简单的方法来链接下载类型的树视图到相同类型的可观察列表。 主控制器。JAVA Download.java 如何实现按对象删除(下载)机制,是否有更简单的方法将observablelist的项绑定到treeview?