我在构造Java JEE后端以处理会话(与tomcat一起提供的JEE servlet)时遇到麻烦。
我的前端在另一台服务器上,该服务器没有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服务器,这对于我现在来说已经太多了。
答案 0 :(得分:0)
如果需要负载平衡,那么我认为您应该查看服务器体系结构。前端文件(即HTML,Javascript和图像)都已下载到客户端计算机,而这些文件才是实际执行的地方。如果您有多个仅用于HTML和Javascript的服务器,那么这将浪费资源,因为这些服务器仅用作下载HTML和Javascript文件的手段。如果您需要为前端文件提供多个下载源,则可以使用CDN服务器,并且可以从这些源下载前端内容。
真正的动作总是在Tomcat服务器中发生,从客户端计算机进行的所有Ajax调用都在该Tomcat服务器中进行汇聚,在服务器计算机中进行后端代码的执行和后端数据的处理。因此,您应该考虑提供Tomcat集群服务器来处理负载。然后,使会话在这些Tomcat群集上保持粘性。因此,在您的前端用户请求之间不会发生会话混淆。会话存储对于域或子域是唯一的。因此,通常不可能在多个域或子域之间共享会话。如果您具有群集的Tomcat服务器,那么粘性会话将帮助您避免此问题。然后自然会有一个带有反向代理的负载均衡器来进行白色标记。
前端和后端代码的分离实际上需要通过良好的编码技巧来实现,而不是为js和后端tomcat文件提供不同的服务器。如果您没有良好的编码结构,那么即使您有用于js和后端文件的不同服务器,您也可能最终会在前端和后端之间或之间产生交叉的代码。