Javascript 从重定向请求抓取头到angular js应用程序
我有以下情况:我有两个应用程序需要相互对话:一个JSF登录页面和一个angular js应用程序。我无法修改JSF登录页面。我可以修改角度应用程序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登录页面登录。用户从浏览器访问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头获取令牌