AngularJS不拦截地址栏的直接请求

我正在创build一个使用JWT令牌进行authentication的AngularJS应用程序。 令牌正在使用AngularJS拦截器传递,如下所示。

'request': function(config) { if (store.get('jwt_token') != null) { config.headers['x-access-token'] = store.get('jwt_token'); } else { config.headers['x-access-token'] = ''; } return config; } 

每当我访问任何/restricted页面,一切工作正常。 问题是,当我通过直接在地址栏中inputURL(或刷新页面)来访问/restricted页面时,AngularJS会被绕过,因此拦截器不会拦截请求,而令牌是不及格。

我一直在寻找一些,我发现了一些解决scheme,比如用一段加载AngularJS的代码进行响应,然后从那里进行redirect。 不过, 如果可能的话我正在寻找一个更简单/整洁的方法,因为我可能在这里错过了一些东西

我可以通过检查x-access-token来检测请求是否来自AngularJS,因为我总是通过它(如果用户未经过身份validation,则为空值)。

亚历克斯的回答是指出确切的问题,谢谢亚历克斯。

我终于明白了昨天。 我去的解决scheme是确保所有的请求来自AngularJS,我有一个限制页面的列表,如果任何请求,我打电话一个函数来validation和validation服务器端的JWT令牌,如果它是有效的,继续,否则,进入login页面。 关键是确保所有请求都应该到index.html以确保AngularJS正在处理路由。

这个链接帮助我解决了这个问题。

http://arthur.gonigberg.com/2013/06/29/angularjs-role-based-auth/

听起来好像Angular的路由器和服务器端点之间存在混淆。

你可能会触发$ httpconfiguration,而浏览应用程序时,使用URL的Angular的路由器(工作正常)跟踪,而/restricted URL是服务器的 URL。

因此,当你在Angular应用程序之外(在浏览器中)询问/restricted任何内容时,它将直接向服务器发送请求,而不是通过Angular路由器或应用程序。

基本上,您需要在Angular应用程序中创buildrestricted上下文中的路由,并在初始化时运行$ httpconfiguration。 除了index.html/ )之外,您不应该直接在地址栏中调用服务器端点。

我build议有一个名为/restricted-area的Angular路由,这样当用户点击它时,它总是会使用你所拥有的$ http方法,通过一个专用的Angular路由,通过一个控制器在内部调用服务器/restricted端点。

两个月前我曾问过类似的问题。 我所理解的是,通常在javascript前端框架之前,http请求的服务方式是:

  • 我们在地址栏中input一个url。
  • 浏览器发送请求。
  • 服务器获取请求。
  • 提供必要的html,js和css文件。
  • 浏览器呈现它。

但是,随着最近转向各种JavaScript前端框架和使用REST风格的API已经开始,请求需要有授权头。 因此,在许多带有javascript框架(如angularjs)的单页网页应用程序中,

  • 发送“/”路由器的初始请求
  • 服务器将Web应用程序提供给您的浏览器
  • web应用程序中的所有进一步路由都是在您的前端应用程序中完成的,因此在您的url之后加上“#”。
  • 请求由应用程序通过angular度js从您的应用程序获取,更新,删除或张贴。

所以当你从angular应用程序发出请求时。 您的请求被拦截器截获,并被拦截器拦截。 但是,当您从地址栏中inputurl时,浏览器会直接向服务器发送请求,因为在请求的那一点,浏览器尚未加载您的angular度networking应用程序。

我build议你设置html5mode为false,并在你的路线之前加一个#

localhost/#/restricted ,并从你的路由提供者进行路由。 当你的路由之前有#号时,请求/去服务器,你的应用程序加载,并使一些控制器进入/restricted你的应用程序向所需的服务器端点发出http请求。 通过这种方式,请求将通过您的应用程序发送,并被您的拦截器拦截。 刷新并直接在地址栏中input地址也可以。

我假设,如果你访问页面/限制你的Angular应用程序将启动正确,这只是一个login问题。

如果您没有令牌,则必须redirect到login页面。 您可以将login名显示为模式叠加,然后您不必切换页面。 拦截器将监视状态401的响应结果。在这种情况下,拦截器将显示login。 在成功login后,拦截器将使用令牌执行原始请求。

你可以在angular度应用程序中find一个工作示例

只需在cookie中传递此标记,而不是在标题中。