我正在开发 Java 应用程序。前端将是 Angular2 。
如果我尝试打开我的应用程序主页( index.html 在 web.xml 中配置为默认页面)。访问网址应为 http://localhost:8080/MyWebApp 。
然后我进入了标准组织的登录页面进行身份验证。如果验证成功,将在请求标头中设置HTTP授权令牌,最后控件将显示我的应用程序主页。
如果我使用 jsp ,我可以请求标题,
String authHeader = request.getHeader("authorization");
out.println("<h2>HTTP Authorization header:</h2>");
if (authHeader == null) {
out.print("No authorization header");
} else {
out.print("<textarea readonly id='authHeader' rows=\"5\" cols=\"80\">" + authHeader + "</textarea>");
}
但我们使用 html 作为前端,因为 angular 2 。
因此,对于我的方案,我如何才能获得请求标头和令牌。
如果不清楚,请不要犹豫,编辑我的问题。
答案 0 :(得分:2)
You can't get a value of a header from client-side JavaScript。唯一的例外是User-Agent和Referrer标头,因为浏览器提供document
和navigator
对象中的值。
你说你正在开发一个带有Angular 2前端的Java应用程序,而另一些应用程序提供了一个令牌(可能有助于指明这是否是标准的,例如OAuth2)。我会假设它是一个自定义令牌。我相信你也意味着你有一些服务器端组件,一个servlet。
您可以做的是使用servlet(甚至是JSP)实现身份验证,然后重定向回Angular 2前端应用程序,将URL中的令牌作为查询参数传递。 URL is easy to read in Angular 2。不过这是not very secure, even if you use JWT之类的内容。作为URL的替代方法,您可以使用Set-Cookie
标头,然后从Angular中读取cookie。
几乎安全的是使用服务器端(servlet甚至JSP)对用户进行身份验证。然后创建一次性令牌,在重定向到HTML页面时,该令牌将作为查询参数传递到URL中。然后在再次调用服务器时使用一次性令牌,使用来自Angular 2的正确REST请求和请求和响应来检索真实的身份验证令牌。
取决于您拥有多少控制权以及auth应用程序使用何种身份验证,您可能需要查看OAuth2。它涉及大量不同的身份验证方案。具体而言,OAuth2 implicit grant flow用于从仅客户端应用程序验证用户。即使你不能使用它,它也会给你一些想法。
答案 1 :(得分:1)
当您使用服务器端授权时,您的服务器会将带有授权的标头放入您的HTML页面。但是,您也可以通过服务器端的元标记将此标记放到页面响应中。然后通过js访问元标记。
<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
Meta标签与响应标头类似,可以完成或覆盖响应标头。 请阅读此帖子Spring Security CSRF Token not working with AJAX call & form submit in same JSP
答案 2 :(得分:0)
您可以在服务器端处理此问题(JSP的表达式在服务器端工作),在服务器上创建一个处理程序方法,您可以在其中检查标题,然后重定向到Angular App。
答案 3 :(得分:0)
我认为我们可以在HTML页面中使用HTTP HEAD方法作为JQUERY AJAX请求。
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
HEAD方法要求响应与GET请求的响应相同,但没有响应主体。这对于检索在响应头中编写的元信息非常有用,而无需传输整个内容。
ajaxRequest = $.ajax({
type: "HEAD",
async: true,
url: 'index.jsp',
success: function(message){
var headerValue =ajaxRequest.getResponseHeader('Content-Length')]);
}
});
答案 4 :(得分:0)
有很多方法可以解决这个问题,因为我之前面对的很多,我更喜欢的是;
在登录页面中完成身份验证并生成令牌后,我将其存储到HTML存储中,请将其置于localStorage中。
您应该了解不应直接访问视图,并且必须在访问页面(视图)之前进行身份验证(或可能是授权)步骤。
所以你可以做的是设置一个URI来访问任何页面,考虑到这一点;
http://host/appname/pageName
当您通过ajax调用连接此URI时,在标头中添加存储在localStorage中的令牌。并检查所有身份验证和授权是否有效,如果成功返回视图,则(如URI中建议的 pageName ),否则返回登录视图。
答案 5 :(得分:0)
如果我理解正确的话,
Angularjs是一个客户端框架,旨在通过提供应用程序逻辑减少其负载来在浏览器内运行而无需服务器的任何干预 所有需要由angular执行的操作只能在加载HTML和javascript后由浏览器在客户端启动。 角度的范围仅限于该区域,任何方式都不是客户端框架的实际意图。
关于请求响应标头,您只能访问AJAX请求的标头
以下是解决这些问题的方法: -