多用户安全java web应用程序
我有一个任务是制作一个多用户安全的游戏,尽管当我在同一浏览器的不同选项卡中运行该应用程序的两个实例时,它们会同步并成为相同的游戏状态。这有什么办法吗?另外,如何防止两个用户加载存储在服务器上的相同保存文件。我正在使用Jsp和servlet创建这个应用程序 编辑:这里是我的servlet代码,它执行所有操作,我的所有jsp页面只获取对象和显示数据多用户安全java web应用程序,java,jsp,session,web-applications,javabeans,Java,Jsp,Session,Web Applications,Javabeans,我有一个任务是制作一个多用户安全的游戏,尽管当我在同一浏览器的不同选项卡中运行该应用程序的两个实例时,它们会同步并成为相同的游戏状态。这有什么办法吗?另外,如何防止两个用户加载存储在服务器上的相同保存文件。我正在使用Jsp和servlet创建这个应用程序 编辑:这里是我的servlet代码,它执行所有操作,我的所有jsp页面只获取对象和显示数据 package can; import javax.servlet.RequestDispatcher; import javax.servlet.*;
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;
}
}
}
}
包装罐;
导入javax.servlet.RequestDispatcher;
导入javax.servlet.*;
导入java.io.FileNotFoundException;
导入javax.servlet.http.*;
导入java.io.IOException;
导入java.io.FileOutputStream;
导入java.io.ObjectInputStream;
导入java.io.InputStream;
导入java.io.ObjectOutputStream;
公共类SaveLoader扩展了HttpServlet
{
公共存储加载程序(){}
public void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException
{
HttpSession sesh=request.getSession();
字符串username=request.getParameter(“用户名”);
字符串gameType=request.getParameter(“gameType”);
字符串closeCase=request.getParameter(“closeCase”);
字符串继续=request.getParameter(“继续”);
字符串offer=request.getParameter(“offer”);
游戏;
if(username==null&&gameType==null&&closeCase==null&&procedure==null&&offer==null)
{
response.sendRedirect(request.getContextPath()+“/”);
返回;
}
//来自主页的参数
如果(用户名!=null&&gameType!=null)
{
if(游戏类型等于(“NG”))
{
游戏=新游戏();
game.setUsername(用户名);
sesh.setAttribute(“游戏”,游戏);
响应。发送重定向(“游戏”);
返回;
}
else if(游戏类型等于(“LG”))
{
response.sendRedirect(request.getContextPath()+“/”);
返回;
}
}
if(sesh.getAttribute(“游戏”)==null)
{
response.sendRedirect(request.getContextPath()+“/”);
返回;
}
其他的
{
//用户点击案例
if(closeCase!=null)
{
game=(game)sesh.getAttribute(“game”);
如果(game.getCaseLeft()!=0)
{
int closeCaseINT=Integer.parseInt(closeCase);
closeCaseINT=closeCaseINT-1;
公文包[]temp=game.getBriefcase();
温度[closeCaseINT].setOpen(真);
游戏。挫折案例(临时);
int cases=game.getCaseLeft();
例=例-1;
游戏。设置案例左侧(案例);
响应。发送重定向(“游戏”);
返回;
}
其他的
{
响应。发送重定向(“游戏”);
返回;
}
}
//打开案例数量后,用户单击“下一步”
如果(继续!=null)
{
game=(game)sesh.getAttribute(“game”);
if(procedue.equals(“nxt”)和&game.getRoundN()!=5)
{
公文包[]temp=game.getBriefcase();
双倍奖金=0;
int病例数=0;
双最大值=0;
对于(int i=0;imax)
{
max=temp[i].getAmount();
}
}
}
临时奖金=临时奖金/案件数;
game.setMaxInPlay(最大值);
游戏。setPrize(tempPrize);
答复:银行;
返回;
}
其他的
{
公文包[]temp=game.getBriefcase();
双倍奖金=0;
对于(int i=0;i
}
下面是我的所有jsp页面用来获取对象的内容
<%
HttpSession sesh = request.getSession();
Game game = (Game) sesh.getAttribute("Game");
if(game == null)
{
response.sendRedirect(request.getContextPath() + "/");
return;
}
%>
您能提供一些代码示例吗?从您所说的,听起来您的程序不是线程安全的。要针对您的问题提供帮助,您需要提供更多信息。使用my servlet和jsp scriplet更新,可能会有所帮助?您在会话中存储的内容对于每个客户端都是唯一的,因此没有问题。通过浏览器将JESSIONID cookie与每个请求一起发送到服务器来维护会话。您的浏览器将为每个打开的选项卡发送相同的cookie,这是大多数用户通常想要的。尝试使用图标标签。另见: