使用Node Express和Passport捕获锚链接/路由

许多JavaScript框架利用锚标签在SPA内build立路由。 是否有可能捕获锚路由保存在我的会话存储进行身份validation?

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

routes.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不捕获锚path,只有应用程序path和查询stringvariables – 任何想法? 我没有看到任何可以让我捕获这些信息的快速文档。

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

你可以使用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); }); 

我最近不得不这样做:login后redirect到散列URL。 我的解决scheme是从document.location.hash中捕获散列片段,并将其存储在login表单的隐藏字段中。 然后在护照本地策略function,我捕捉它

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

身份validation后,默认redirect到我的主页,但在该路线我检查,看看是否req.flash('redirectHash')为空; 如果它不为空,我用它来完成我的redirect到所需的位置。

没有跨浏览器testing,但在铬中工作。

这里是如何捕获锚链接。 适用于所有Web框架。

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

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

  2. 所有的服务器知道的是,用户希望http://server.com/ ,他们是未经authentication的。 服务器将用户redirect到login表单。

  3. 这里是聪明点:客户端仍然在等待原来的请求,所以如果服务器在login表单中包含一个隐藏的元素与一些引用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. 用户对自己进行身份validation,并使用POST发送原始URL。 然后,服务器可以将用户转到原始的深层URL。