从angular-js应用的重定向请求中抓取一个头文件

Grabbing a header from a redirect request to an angular-js application

本文关键字:一个 文件 抓取 应用 angular-js 重定向 请求      更新时间:2023-09-26

我有以下情况:我需要使两个应用程序相互通信:一个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