java - 多用户安全 Java Web 应用程序
问题描述
我有一个任务说要制作一个多用户安全的游戏,但是当我在同一浏览器的不同选项卡中运行此应用程序的两个实例时,它们会同步并成为相同的游戏状态。有没有办法解决?另外,我如何防止两个用户加载相同的保存文件,因为它们存储在服务器上。我正在使用 Jsp 和 Servlets 来创建这个应用程序。
编辑:这里是我的 servlet 代码,它执行所有操作,我所有的 jsp 页面只获取对象并显示数据
package can;
import javax.servlet.RequestDispatcher;
import javax.servlet.*;
import java.io.FileNotFoundException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
public class SaveLoader extends HttpServlet
{
public SaveLoader() {}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
HttpSession sesh = request.getSession();
String username = request.getParameter("username");
String gameType = request.getParameter("gameType");
String closeCase = request.getParameter("closeCase");
String proceed = request.getParameter("proceed");
String offer = request.getParameter("offer");
Game game;
if(username == null && gameType == null && closeCase == null && proceed == null && offer == null)
{
response.sendRedirect(request.getContextPath() + "/");
return;
}
//Parameters coming from homepage
if(username != null && gameType != null)
{
if(gameType.equals("NG"))
{
game = new Game();
game.setUsername(username);
sesh.setAttribute("Game", game);
response.sendRedirect("game");
return;
}
else if(gameType.equals("LG"))
{
response.sendRedirect(request.getContextPath() + "/");
return;
}
}
if(sesh.getAttribute("Game") == null)
{
response.sendRedirect(request.getContextPath() + "/");
return;
}
else
{
//user clicks on case
if(closeCase != null)
{
game = (Game) sesh.getAttribute("Game");
if(game.getCaseLeft() != 0)
{
int closeCaseINT = Integer.parseInt(closeCase);
closeCaseINT = closeCaseINT - 1;
Briefcase[] temp = game.getBriefcase();
temp[closeCaseINT].setOpen(true);
game.setBriefcase(temp);
int cases = game.getCaseLeft();
cases = cases - 1;
game.setCaseLeft(cases);
response.sendRedirect("game");
return;
}
else
{
response.sendRedirect("game");
return;
}
}
//user clicks on NEXT after opening number of cases
if(proceed != null)
{
game = (Game) sesh.getAttribute("Game");
if(proceed.equals("nxt") && game.getRoundN() != 5)
{
Briefcase[] temp = game.getBriefcase();
double tempPrize = 0;
int caseCount = 0;
double max = 0;
for(int i = 0; i < temp.length; i++)
{
if(temp[i].isOpen() == false)
{
tempPrize += temp[i].getAmount();
caseCount++;
if(temp[i].getAmount() > max)
{
max = temp[i].getAmount();
}
}
}
tempPrize = tempPrize / caseCount;
game.setMaxInPlay(max);
game.setPrize(tempPrize);
response.sendRedirect("bank");
return;
}
else
{
Briefcase[] temp = game.getBriefcase();
double tempPrize = 0;
for(int i = 0; i < temp.length; i++)
{
if(temp[i].isOpen() == false)
{
tempPrize += temp[i].getAmount();
}
}
game.setPrize(tempPrize);
response.sendRedirect("end");
return;
}
}
//bank offer Deal or No deal
if(offer != null)
{
game = (Game) sesh.getAttribute("Game");
int temp = game.getRoundN();
temp++;
game.setRoundN(temp);
if(offer.equals("NoDeal"))
{
game.setPrize(0);
game.setMaxInPlay(0.0);
response.sendRedirect("game");
return;
}
else if(offer.equals("Deal"))
{
response.sendRedirect("end");
return;
}
}
}
}
}
这是我所有的jsp页面用来获取对象的内容
<%
HttpSession sesh = request.getSession();
Game game = (Game) sesh.getAttribute("Game");
if(game == null)
{
response.sendRedirect(request.getContextPath() + "/");
return;
}
%>
解决方案
推荐阅读
- python - 关于“TypeError:需要一个类似字节的对象,而不是'str'”
- php - 如何通过 jquery 将“multipart/form-data”(图片、pdf 等)保存到 mysql 数据库 mediumblob?
- angular - 使用带有 ActionBar 后退按钮的 NativeScript + Angular 递归导航到具有历史记录的相同组件?
- c - 为什么执行这个基本程序会出错?
- python - 给定一个已经创建的python对象,有没有办法通过检查找出构造的实际参数?
- here-api - 清除站点数据中断映射 - IndexedDB 未处理关闭的连接
- angular - 如何为以 Azure AD 作为身份提供者的 Angular 7.x 应用程序实施基于 SAML 的身份验证?
- windows - 如何将批处理文件的结果输出到与输入文件同名的文件夹中?
- jquery - 如何在summernote编辑器中插入bootstrap col,我想将它添加到来自数据库的数据中
- c - double 5.2 如何在二进制文件中表示?