Javascript 从重定向请求抓取头到angular js应用程序

Javascript 从重定向请求抓取头到angular js应用程序,javascript,angularjs,authentication,access-token,Javascript,Angularjs,Authentication,Access Token,我有以下情况:我有两个应用程序需要相互对话:一个JSF登录页面和一个angular js应用程序。我无法修改JSF登录页面。我可以修改角度应用程序 用户通过访问JSF登录页面登录。用户从浏览器访问JSF页面并填写登录表单。如果成功通过身份验证,JSF将生成一个令牌,并在头中发送该令牌,并重定向到包含angular js应用程序的index.html。angular js应用程序如何从该重定向中获取该令牌?这取决于您需要哪种类型的请求头 在xhr的情况下,您很可能会使用http服务执行请求。它的p

我有以下情况:我有两个应用程序需要相互对话:一个JSF登录页面和一个angular js应用程序。我无法修改JSF登录页面。我可以修改角度应用程序


用户通过访问JSF登录页面登录。用户从浏览器访问JSF页面并填写登录表单。如果成功通过身份验证,JSF将生成一个令牌,并在头中发送该令牌,并重定向到包含angular js应用程序的index.html。angular js应用程序如何从该重定向中获取该令牌?

这取决于您需要哪种类型的请求头

xhr
的情况下,您很可能会使用
http
服务执行请求。它的promise(在两种状态下:failed和succeed)都会获得一个
对象
,作为带有
header()
方法的参数,即您需要的方法。您可以获得更多信息:

响应对象具有以下属性:

  • 数据-{string | Object}–使用转换函数转换的响应体
  • status-{number}–响应的HTTP状态代码
  • headers-{function([headerName])}–Header getter函数
  • config-{Object}–用于生成请求的配置对象
  • statusText{string}–响应的HTTP状态文本
编辑

在引导angular之前,当您需要从初始页面请求而不是从
xhr
获取标题时,会遇到一些困难。不幸的是,javascript无法访问它们

一种解决方案是使用代替标头来存储所需的数据。但是在这种情况下,您应该在请求发射器端进行一些更改


另一种方法是在提供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');
}]);
“模块”可以是任何angular应用程序模块。 在控制器中,您可以使用以下方法获取令牌的值:

var token=$cookies.get('myToken');

我也有类似的情况。 通过JSF应用程序登录页面(App1)对用户进行身份验证,并在链接上单击调用servlet,在doPost()中使用token/JWT创建Cookie,并将Cookie添加到响应头中,并重定向到Angular JS(应用2)。 Angular应用程序从cookie读取令牌,并在本地环境中运行良好。 但同样的情况不适用于真正的域名。正在获取未定义的cookie

在doPost()域内。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);
内角应用程序 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 

如果我是angular,我如何才能访问我尚未完成的请求响应?其他一些应用程序重定向到angular应用程序,该重定向包含我希望在angular应用程序中访问的标题。我是否可以使用Cookie将标题存储在以前应用程序的浏览器中,然后使用新应用程序读取这些Cookie?你能阅读应用程序中的cookies吗?好的,我理解你的意思。在启动angular之前,必须从初始页面请求中获取标题。等一下,我会考虑我的答案.而这个页面仅仅是静态html?或者由某个东西(php、ruby、aspb节点等)解释/编译?我可以跨应用程序共享cookie吗?您不必使用JSF应用程序中的cookie,因为您可以通过http拦截器直接从http头获取令牌