我不希望在浏览器标签之间共享用户的HTTP会话。
例如,如果用户在标签1中登录系统,他可以看到他的所有个人资料详细信息。但是,当从另一个新选项卡(选项卡二)中点击相同的URL时,它还会显示相同的用户配置文件详细信息。
我想将用户会话限制为仅打开的第一个标签。如果打开另一个选项卡,则不应使用第一个选项卡的会话。有什么方法可以实现这一目标吗?
答案 0 :(得分:0)
您无法为浏览器中的每个标签创建不同的会话。
以下方式用于限制用户再次login
浏览器另一个标签中的同一个应用程序。
这对我有用。
在IE
中,您必须在浏览器中创建新会话才能以不同的用户身份登录。
您可以通过以下步骤限制用户不要在其他标签页中打开URL
当用户点击login
按钮时,请检查session
中的server code
,
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("UTF");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
boolean loginStatus ;
if( (name != null && name.equals("human")) && (password != null && password.equals("human")) ){
loginStatus = true;
HttpSession session = request.getSession();
String status = (String)session.getAttribute("status");
if(status != null && status.equals("loggedin")){
// if status is not null , you can justify that , the user is already loggedin in the same session
response.sendRedirect("redirect.jsp");
}else{
// If the user is trying to login first time,This will work
// do your login work here
if(loginStatus){
session.setAttribute("status","loggedin");
RequestDispatcher rd = request.getRequestDispatcher("success.jsp");
rd.forward(request, response);
}
}
}else{
System.out.println("Authentication failed !");
response.sendRedirect("fail.jsp");
}
}
您的redirect.jsp
将是,
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Calculator</title>
</head>
<script type="text/javascript"></script>
<body>
<h1 style="color:red;"> You are already in logged in state </h1>
</body>
</html>
希望这个技巧能够奏效。
答案 1 :(得分:0)
您可以使用会话ID发送每个请求! 然后通过服务器上的sessionID获取每个会话。
答案 2 :(得分:0)
之前我已经做过,尽管没有Java,只有JavaScript。不过,这应该适用于您的情况。
标准方法
您遇到的问题是......您正在使用cookie,这是允许某人登录一次的标准方法,然后进入任何一个选项卡并仍然登录。这是最好的方法在大多数情况下。但是,请记住,cookie会随着每次点击一起发送到服务器,如果您拥有非公开的CSS,JS,IMG等数据,这可能非常重要。
单独会话
为了将每个标签(页面)区分为单独的会话,您要做的是在页面中使用会话标识符,而不是使用cookie。 (如前所述,您可能需要两者都允许私有数据。)
这适用于您可以轻松创建隐藏<input>
标记的表单:
<input type="hidden" name="session" value="123"/>
这假设您正在动态生成页面,因此每次有人点击该页面时,您都会获得一个新会话(实际上您应该有一个特殊登录页面来获取会话,然后导航到显示绝密数据的重要页面......)
但是,您会发现... 您负责在每个地方手动携带该会话标识符。这可能非常繁琐(即 NO 直接链接在任何地方都有效,因为有人点击一个简单的锚链接不会发送特殊会话,除非你将它作为参数添加到查询字符串...或类似的东西。但是会话在URL中可见。所以使用类似jQuery()的东西你必须捕获每个链接,如果点击你实际上“POST一个重定向”。正如我所说,这是相当多的工作!)
另请注意,一旦用户关闭此页面,就他而言,他已经退出。但是,会话仍在服务器上处于活动状态。要真正记录用户,您必须使用onclose
事件,并确保向服务器发送快速通知,要求取消会话。
混合方法
使用两种方法:隐藏的输入(或任何你想要的标签,非常容易用jQuery代码检索)和cookie,你可能会有更好的运气。也就是说,您可能知道用户使用cookie“半登录”。但是,如果没有会话标识符,则不会显示某些其他绝密数据。