从angular-js应用的重定向请求中抓取一个头文件
Grabbing a header from a redirect request to an angular-js application
我有以下情况:我需要使两个应用程序相互通信:一个JSF登录页面和一个angular-js应用程序。我无法修改JSF登录页面。我可以修改angular应用。
用户通过访问JSF登录页面登录。用户从浏览器访问JSF页面并填写登录表单。如果身份验证成功,JSF将生成一个令牌,并在标头中发送该令牌,并将其重定向到包含angular-js应用程序的index.html。angular-js应用如何从重定向中获取令牌?
这取决于你需要什么样的请求头。
在xhr
的情况下,很可能您将使用http
服务来处理您的请求。它的promise得到(在两种状态下:失败和成功)一个object
作为一个参数与header()
方法,你需要的一个。你可以在这里获得更多信息:
响应对象具有以下属性:
- data - {string|Object} -用转换函数转换的响应体。
- status - {number} -响应的HTTP状态码。
- headers - {function([headerName])} - Header getter函数。
- config - {Object} -用于生成请求的配置对象。
- statusText {string} -响应的HTTP状态文本。
编辑
在angular启动之前,当你需要从初始页面请求而不是从xhr
获取头文件时,会遇到困难。不幸的是,javascript无法访问它们。
一个解决方案可以使用cookies
而不是头来存储您需要的数据。但是在这种情况下,您应该在请求发送端做一些更改。
另一种方式,可能是在提供html之前在服务器上处理请求。之后,你可以直接在标记中传递它们,或者以某种方式记住它们,然后直接从angular发送一个xhr
请求。但是如果您有一个简单的静态页面,您将无法实现这一点。
我认为你必须创建一个http拦截器,将从http请求中获取报头,而不是将其存储在cookie或本地存储中。
编辑 :试试这个:
module.factory('myTokenInterceptor', ['$cookies', function($cookies) {
var myTokenInterceptor = {
'request': function(config) {
if (config.url=='index.html')
{
var myToken=config.headers['myToken'];
$cookies.put('myToken', myToken);
};
}
};
return myTokenInterceptor;
}]);
module.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('myTokenInterceptor');
}]);
"module"可以是任何angular应用的模块。在控制器中,可以使用以下命令获取令牌的值:
var token=$cookies.get('myToken');
我也有类似的情况。通过JSF应用程序登录页面(App1)对用户进行身份验证,点击链接调用servlet,在doPost()中使用令牌/JWT创建Cookie,并将Cookie添加到响应头中,并重定向到Angular JS (App 2)。Angular应用从cookie中读取令牌,并在本地环境下正常工作。但同样的不工作与真正的域名。get cookie undefined
Inside doPost() Domain.com/App1
Cookie cookie = new Cookie("AUTH_SESSION", URLEncoder.encode(
token, "UTF-8"));
cookie.setDomain(domain.com);
cookie.setMaxAge(30);
cookie.setHttpOnly(false);
cookie.setPath(“/”);
response.addCookie(cookie);
String redirectUrl = bean.getRedirectServletUrl();
response.sendRedirect(redirectUrl);
AngularApp内部Domain.com/app2
angular.module('app').service('CookieInitializer',
['$cookies', 'Session', '$location', CookieInitializer]);
function CookieStateInitializer($cookies, Session, $location) {
var init = function() {
var cookie = $cookies.get('FS_SESSION'); // undefined when using domain name
两个应用程序通过上下文路径来区分。并添加代理,使两个应用程序使用相同的域名。
Domain.com/app1
domain.com/app2 --> apphost.com:443
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- Sails.js:同时发布文本输入和一个文件
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 要求定义另一个文件中的对象
- 是否可以使用JavaScript/AAJAX在客户端创建一个文件
- 如何将所有JS文件连接到一个文件夹中
- 请求准备一个文件并返回路径,允许用户在准备好时下载
- 从AngularJS中的另一个文件中的控制器访问服务
- 将任何CDN配置为只传递一个文件,无论请求的url是什么
- 通过AngularJS promise下载一个文件
- Grunt-将多个文件最小化/处理为一个文件
- 文件的节点自动化移动到另一个文件夹中
- 用于文件移动到另一个文件夹的Javascript自动化
- 需要从一个文件中获取多个模块
- 仅首先需要使用jasmine从节点添加一个文件
- jQuery Mobile样式从另一个文件加载内容
- 最小化CSS/JS文件,并使用命令行创建一个文件
- 我如何制作一个文件的副本并用gump将其移动到父文件夹
- 为什么当我上传文件并点击更多上传另一个文件的第一个删除