【问题标题】:Html vs JSP - get request header token valueHtml vs JSP - 获取请求标头令牌值
【发布时间】:2017-07-28 13:47:51
【问题描述】:

我正在开发 Java 应用程序。前端是 Angular2

如果我尝试打开我的应用程序主页(index.htmlweb.xml 中配置为 default page)。访问 URL 应为 http://localhost:8080/MyWebApp

然后我进入了一个标准组织的登录页面进行认证。如果身份验证成功,HTTP 授权令牌将设置在 请求标头 中,最后控制显示我的应用程序主页。

如果我使用 jsp,我可以得到 request header 作为,

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

所以对于我的场景,我怎样才能获得 请求标头token

如果不清楚,请随时编辑我的问题。

【问题讨论】:

  • 如果我理解正确,我认为答案是 Javascript 无法访问初始请求,因此您可以 1)在输出 html 中打印它们或 2)在页面之后发出另一个 ajax http 请求加载。
  • 你能把这个作为答案发布吗?
  • 如何将其打印为 html ?
  • 如果你使用像 spring 这样的 MVC,它们是 thymeleaf,可以在 HTML 中使用。
  • 进行身份验证,请求正在发送到 servlet?

标签: javascript java html jsp angular


【解决方案1】:

You can't get a value of a header from client-side JavaScript。唯一的例外是 User-Agent 和 Referrer 标头,因为浏览器提供了 documentnavigator 对象中的值。

您说您正在开发一个带有 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 调用以及请求和响应来检索真正的身份验证令牌。

取决于您拥有多少控制权以及身份验证应用程序使用哪种身份验证,您可能需要查看 OAuth2。它处理许多不同的身份验证场景。具体来说,OAuth2 implicit grant flow 用于对来自客户端应用程序的用户进行身份验证。即使你不能使用它,它也会给你一些想法。

【讨论】:

    【解决方案2】:

    当您使用服务器端授权时,您的服务器会将带有授权的标头放入您的 HTML 页面。但您也可以通过服务器端的元标记将此令牌放入您的页面响应中。然后通过js访问meta标签。

    <meta name="_csrf" content="${_csrf.token}"/>
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    

    元标记类似于响应标头,可以完成或覆盖响应标头。 请阅读这篇文章Spring Security CSRF Token not working with AJAX call & form submit in same JSP

    【讨论】:

      【解决方案3】:

      您可以在服务器端处理这个问题(JSP 的表达式在服务器端工作),在服务器上创建一个处理程序方法,您可以在其中检查标头,然后重定向到您的 Angular 应用程序。

      【讨论】:

        【解决方案4】:

        我认为我们可以在您的 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')]);
                }
        });
        

        【讨论】:

          【解决方案5】:

          有多种方法可以解决这个问题,因为我以前经常遇到这个问题,而我更喜欢的是;

          当登录页面中的身份验证完成并生成令牌时,我将其存储到 HTML 存储中,使其位于 localStorage 中。

          您应该了解的要点是,您的视图不应直接访问,并且在访问页面(视图)之前必须进行身份验证(或可能是授权)步骤。

          所以你可以做的是为访问任何页面设置一个 URI,考虑一下;

          http://host/appname/pageName 
          

          当您通过 ajax 调用连接此 URI 时,将存储在 localStorage 中的令牌添加到标头中。并检查所有身份验证和授权工作,如果成功返回视图(如 URI 中建议的 pageName),否则返回登录视图。

          【讨论】:

            【解决方案6】:

            如果我理解正确,

            Angularjs 是一个客户端框架,旨在通过为应用程序逻辑提供服务来减少其负载,从而在没有任何服务器干预的情况下在浏览器中运行 所有需要 Angular 执行的操作,只有在加载 HTML 和 javascript 后,才会由浏览器在客户端发起。 Angular 的范围仅限于该区域,无论如何它都不是缺点,而是客户端框架的实际意图。

            关于请求响应标头,您只能访问 AJAX 请求的标头

            以下是这些问题的解决方案:-

            • 如果您使用 tomcat 或任何 serverlet 容器来提供应用程序或托管 angular 代码,您可以使用 HTML 的 JSP,因为 JSP 在传递到客户端之前由 serverlet 容器处理为 html。我认为这根据我对您的问题的推断,解决方案将适用于您的情况
            • 否则配置从身份验证服务器和角度处理成功和失败处理程序的 serverlet,您需要轮询 serverlet 以获取请求标头值。

            【讨论】:

              猜你喜欢
              • 2020-11-16
              • 2018-07-05
              • 2017-09-22
              • 2017-04-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-26
              • 2019-09-16
              相关资源
              最近更新 更多