3

许多 javascript 框架利用锚标记在 SPA 中建立路由。是否可以在身份验证时捕获锚路由以保存在我的会话存储中?

例如,使用快递和护照,我有:

路由.js

//node stuff above
app.get('/', auth.savePath, pages.index);

auth.js

exports.savePath = function (req, res, next) {
    if (!req.isAuthenticated()) {
        req.session.returnPath = req.originalUrl
        return res.redirect('/login')
    }
    next()
}

req.originalUrl 不捕获锚路径,只有应用程序路径和查询字符串变量 - 有什么想法吗?我在快速文档中看不到任何其他可以让我捕获此信息的内容。

4

4 回答 4

1

哈希片段(您称为锚点)永远不会发送到浏览器,因此您无法捕获它。要么更改您的 URL 方案以不使用散列片段,甚至更好:使用客户端库在客户端执行逻辑。存在许多这样的库,通常称为“客户端路由器”。

于 2013-09-14T06:55:20.837 回答
0

您可以使用这里app.param解释的

以下是一些代码。req.params.id 捕获“id”。

app.param('id', /^\d+$/);
  app.get('/user/:id', function(req, res){
  res.send('user ' + req.params.id);
});

使用Angular-ui-router,我相信你可以解决上述目的:

 var myApp = angular.module('myApp', ['ui.router']);
 myApp.config(function($stateProvider, $urlRouterProvider) {

 // Now set up the states
 $stateProvider
  .state('/', {
    url: "/",
    templateUrl: "partials/loginQuestion"
   })

快速路由器将包括以下内容:

app.get('/partials/:name', function (req, res) {
    var name = req.params.name;
    console.log(name);
    res.render('partials/' + name);
});
于 2013-09-14T06:52:16.877 回答
0

我最近也必须这样做:登录后重定向到散列 URL。我的解决方案是从 document.location.hash 中捕获哈希片段并将其存储在登录表单的隐藏字段中。然后在护照本地策略功能中,我用

req.flash('redirectHash' : req.body.myHiddenFieldName).

身份验证后的默认重定向路由到我的主页,但在该路由中我检查是否req.flash('redirectHash')为空;如果它不为空,我用它来完成重定向到所需位置。

尚未跨浏览器进行测试,但可以在 chrome 中使用。

于 2014-04-14T23:36:29.303 回答
0

这是捕获锚链接的方法。适用于所有 Web 框架。

我将使用一个示例场景来说明:假设我们需要捕获未经身​​份验证的用户请求的深层 URL http://server.com /#/xyz,以便他们可以在登录后重定向到该深层 URL。

  1. 未经身份验证的用户请求http://server.com /#/xyz(从“#”开始的所有内容都不会发送到服务器)。

  2. 服务器所知道的是用户想要http://server.com/并且他们未经身份验证。服务器将用户重定向到登录表单。

  3. 这是一个聪明的地方:客户端仍在等待他们的原始请求,所以如果服务器在登录表单中包含一个隐藏元素,其中包含一些引用 window.location.href 的 JS,它可以捕获原始请求的完整URL锚点部分:

    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username"/><br/>
      </div>
      <div>
        <label>Password:</label>
        <input type="password" name="password"/>
      </div>
      <!-- XXXXXXXXX CLEVER BIT XXXXXXXXXX-->
      <script>
        document.write('<input type="hidden" name="from" value="'+document.location.href+'"/>');
      </script>
      <!-- XXXXXXXXXX-->
      <div>
        <input class="submit-button" type="submit" value="Submit"/>
      </div>
    </form>
    
  4. 用户对自己进行身份验证,原始 URL 与 POST 一起发送。然后,服务器可以将用户中继到原始深层 URL。

于 2015-03-01T02:18:37.457 回答