10

我有一个应用程序,它是服务器上的 Node + Express + Passport 和客户端上的 jQuery + Backbone.js。客户端在 URL 中使用哈希标签,但对于某些功能,用户登录很重要。

我希望可以通过 URL 访问该应用程序,例如http://mydomain.com/app#cone/waffle/flavor/mint/toppings/sprinkles

  • 如果用户已经登录,他们会直接访问请求的 URL,没有任何麻烦
  • 如果用户尚未登录,他们会转到/login然后转到请求的 URL

在这个 SO 帖子之后, Node.js Passport 的 Google 策略上的自定义 returnUrl,我有它,所以

  • 如果他们已经登录,他们会直接访问 URL、哈希标签和所有
  • 如果他们没有被记录,它会将他们带到登录页面,然后到请求的 url,但是......

登录后似乎从重定向的原始 URL 中删除了哈希参数。

将哈希参数重定向到原始目的地时,有什么方法可以保留它们?

从这篇文章,从请求 url 获取哈希参数,我了解到哈希标签在服务器上不可用,这是使用哈希标签的全部意义所在。

所以我怀疑这是不可能的。也许以某种方式在本地缓存参数并在重定向时检索它们,比如说[original URL minus hastags] + #use-cached-params

4

2 回答 2

9

哈希参数仅限浏览器使用,它们不会发送到服务器。不过,您可以使用此技术进行重定向、哈希标签和所有操作:

  • 获取 /some/page#with/hash
  • 登录?然后渲染页面
  • 未登录?渲染一个包含一些 JavaScript 的页面,比如“getHash.jade”
  • getHash.jade:复制完整的 URL,然后重定向到 '/login&redirect=' + originalURL
  • GET /login(现在您可以将哈希保存在服务器上并从那里获取)
于 2013-03-10T03:48:10.450 回答
1

这是更详细地捕获锚链接的方法。适用于所有 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:20:21.753 回答