java - 托管在不同服务器上的 JavaScript 前端的 JEE session

标签 java ajax session-cookies backend session-state

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

我的前端位于另一台没有 Java、只有 html 和 JavaScript 的服务器上。 JavaScript 使用 ajax 将用户名和密码发布到后端服务器,该服务器将创建一个 session :

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

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

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 服务器,这对我来说现在无法处理。

最佳答案

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

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

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

关于java - 托管在不同服务器上的 JavaScript 前端的 JEE session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696230/

相关文章:

java - 无需特定 XSD 即可验证 XML

javascript - 为什么我的部分 Rails 渲染不正确?

Django SSL 仅适用于某些页面

javascript - 在单个脚本中声明两个或多个 casper

java - @Value 属性名称中的转义“(双引号)

Java 程序无法在 Vista 32 位上运行

java - 如何使用优先队列?

JQuery .load() 回调函数

javascript - knockout JS : Fileupload event

cookies - 如何使用javascript在用户本地存储上保存超过4kb的数据?