【问题标题】:JEE sessions for a JavaScript front end hosted on a different server托管在不同服务器上的 JavaScript 前端的 JEE 会话
【发布时间】:2019-11-03 21:06:21
【问题描述】:

我在构建 Java JEE 后端以处理会话时遇到问题(JEE servlet 与 tomcat 一起提供)。

我的前端在另一台没有 Java 的服务器上,只有 html 和 JavaScript。 JavaScript 使用 ajax 将用户名和密码发布到将创建会话的后端服务器:

   session = request.getSession();
   session.setAttribute("email", email);
   session.setAttribute("auth", "1");

当前端认证后再次通过javascript联系后端时,Java找不到创建的会话。以下是我在 auth 设置为 1 后寻找会话的方式:

HttpSession session = request.getSession();
String auth = (String) session.getAttribute("auth");
if (auth == null || !auth.equals("1")) {
   session.invalidate();// destroy any session that they may have
   System.out.println("Invalid Session");
   JsonGenerator gen = Json.createGenerator(response.getWriter());
   gen.writeStartObject().write("status", "expired").writeNull("data")
   .write("message", "Your session has expired").writeEnd();
   gen.close();
   return;            
}

当前端和后端都托管在具有相同域名的同一台服务器上时,一切正常。但当前端和后端位于具有不同域名的不同服务器上时则不然。我应该如何构造它以便Java可以在前端联系它时检查auth==1?

这是我使用 Ajax 联系后端服务器的方式:

  post_url = 'http://backend.anotherserver.com/api/datapoint'
  $.ajax({
    url: post_url,
    timeout: 10000,
    method: 'POST',
    dataType: 'json',
    success: function (json) {
    if (json.status == 'success' && json.data) {
      // do something
    }
  })

前端和后端的域名不同。在我让一个前端工作之后,我将创建一个具有不同域名的第二个前端,以及第三个、第四个等。它们都将使用相同的后端,并且所有前端都需要能够通过后端进行身份验证.我不想使用 oauth 服务器,这对我来说太多了。

【问题讨论】:

  • 我不确定我是否正确。您是否有相同的应用程序在不同域名的不同前端服务器上运行?例如,您在 3 个不同的前端服务器上运行相同的 TODO 列表应用程序,并且您的用户应该使用 www.mytodo1.com、www.mytodo2.com 和 www.mytodo3.com。这些前端服务器会反过来访问后端tomcat服务器backend.mytodo.com?
  • 是的 Zapping 是正确的。前端是 mytodo1 mytodo2 和 mytodo3,它们与 mytodo 位于不同的服务器上。如果我在 Tomcat 托管的同一台机器上的同一个 java webapp 中创建了一个都称为 mytodo 的前端和后端,那么它可以正常工作。但是前后端分离的时候,session就不行了
  • 我想我仍然没有达到目的。你有这个是为了负载平衡你的应用程序吗?
  • 白标、负载均衡、前后端代码分离。但是,后端服务器确实有一份由 Tomcat 提供的前端代码副本,仅用于测试。后端代码基本上只是一个 API。前端是接触api的html和javascript。

标签: java ajax session-cookies backend session-state


【解决方案1】:

如果负载平衡是您的要求,那么我认为您应该检查您的服务器架构。前端文件,即 HTML、Javascript 和图像都被下载到客户端机器,这就是这些文件的实际执行发生的地方。如果您有多个仅用于 HTML 和 Javascript 的服务器,那么它会过度使用资源,因为这些服务器仅用作下载 HTML 和 Javascript 文件的一种方式。如果您需要为前端文件提供多个下载源,那么您可以使用 CDN 服务器,并且可以从这些源下载前端内容。

真正的动作总是发生在 Tomcat 服务器中,所有来自客户端机器的 Ajax 调用都在这里汇聚,后端代码的执行和后端数据的处理都发生在服务器机器上。因此,您应该考虑提供 Tomcat 集群服务器来处理负载。然后使会话在这些 Tomcat 集群上保持粘性。因此,您的前端用户请求之间不会发生会话混淆。会话存储对于域或子域是唯一的。因此,通常不可能在多个域或子域之间共享会话。如果你有集群的 Tomcat 服务器,那么粘性会话将帮助你避免这个问题。然后自然有一个负载均衡器,带有用于白标的反向代理。

前后端代码的分离实际上需要通过良好的编码架构来实现,而不是为js和后端tomcat文件提供不同的服务器。如果您没有良好的编码结构,那么即使您有不同的 js 和后端文件服务器,您最终也可能会在前端和后端之间交叉或交叉代码。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2020-01-08
    • 2012-06-21
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 2012-08-19
    • 2020-08-10
    相关资源
    最近更新 更多