【问题标题】:VueJS add external site to router historyVueJS 将外部站点添加到路由器历史记录
【发布时间】:2018-09-04 14:03:25
【问题描述】:

我正在使用 Vue Router 构建一个应用程序,该应用程序使用“外部”站点获取登录凭据。它基本上看起来像这样:

Home.Vue

<template>
</template>

<script>
  export default {
    name: "Home",
    data() {
      return {

      }
    },
    created() {
      window.location = 'https://third_party_site.com?nextpage=http://my_site.com/#/entry'
    }
  }
</script>

<style scoped>

</style>

此third_party_site.com 处理身份验证并将JWT 作为结果URL 中的查询字符串发回。当我尝试使用导航守卫(如下所示)获取查询字符串时,Vue 路由器只查看路由器的历史记录。

router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/components/Home'
import Entry from '@/components/Entry'
Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home,
    },
    {
      path: '/entry',
      name: 'Entry',
      component: Entry,
      beforeEnter: (to, from, next) => {
        console.log('to',to)
        console.log('from',from)
        console.log('next',next)
        next()
      },
      meta: {
        title: 'Entry'
      }
    },
  ]
})

控制台打印预期的“to”位置,但“from”位置是基本路径“/”,并且没有查询参数。如何获取“外部”路由以便访问查询参数?生成的“来自”的 console.log 如下。

from 
  {name: null, meta: {…}, path: "/", hash: "", query: {…}, …}
    fullPath: "/"
    hash: ""
    matched: []
    meta: {}
    name: null
    params: {}
    path: "/"
    query: {}
    __proto__: Object

在询问之前,必须以这种方式构建处于当前状态的应用程序,并且我无权访问外部站点。

【问题讨论】:

  • 您是说远程站点在返回您的站点时没有向您的/entry URL 添加查询参数?
  • 我注意到您没有在路由器中使用 HTML5 历史记录模式,所以 nextpage URL 不应该类似于 http://my_site.com/#/entry 吗?
  • 这正是我所说的,Phil。无论是在 /entry 之后添加还是在导航守卫的“from”中可用都无关紧要。我只需要在某个时间点访问它。您对哈希的评论也是正确的;这是我格式化问题时的拼写错误,但它包含在 Home.vue 的 window.location url 中
  • 使用浏览器的 Network 控制台并选中 "Preserve log" 选项。在您浏览身份验证时遵循请求并查看是否...a)远程站点是否包含正确的查询参数,以及 b)如果是,它会发生什么

标签: vue.js jwt query-string


【解决方案1】:

这里在黑暗中狂野射击,但您的 nextpage 查询参数中的 # 可能会与远程站点混淆。

它会看到什么

QUERY    => nextpage=http://my_site.com/
FRAGMENT => #/entry

所以它会重定向回http://my_site.com/,因为它可能会忽略任何片段。

您应该正确编码值,例如

window.location = 'https://third_party_site.com/?nextpage=' + 
    encodeURIComponent('http://my_site.com/#/entry')

这将产生nextpage=http%3A%2F%2Fmy_site.com%2F%23%2Fentry

【讨论】:

  • 这实际上返回了 400“无效 URL”响应。它在地址栏中显示外部 URL(带有我需要的令牌),但不会重定向到所需的页面。
  • 400 来自您的服务器还是他们的?您可能需要开始向您的问题添加一些请求/响应信息
  • 这个远程服务可能无法处理# URL。你有没有机会启用HTML5 History Mode?注意:它确实需要一些服务器配置
  • 我已经尝试了所有我能想到的方法(使用 Vue 路由器尝试推送外部链接、启用历史模式等),但没有任何效果。您指的是需要什么样的请求/响应信息?
  • 查看我上面关于浏览器网络控制台的评论。另外,也许你错过了我关于 400 来自哪里的问题
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2017-08-03
  • 2014-02-05
  • 2022-07-25
相关资源
最近更新 更多