如何使用Java将会话限制为单个浏览器选项卡
How can I use Java to restrict the session to a single browser tab
我不希望用户的HTTP会话在浏览器选项卡之间共享。
例如,如果用户在选项卡一中登录到系统,他可以看到他的所有配置文件详细信息。但是,当从另一个新选项卡(选项卡二(中找到相同的URL时,它也会显示相同的用户配置文件详细信息。
我想将用户会话限制为仅打开第一个选项卡。如果打开了另一个选项卡,则不应使用第一个选项卡的会话。有什么办法可以做到这一点吗?
您不能为浏览器中的每个选项卡创建不同的会话
以下方式用于限制用户在浏览器的另一个选项卡中再次login
相同的应用程序。
这对我有效。
在IE
中,您必须在浏览器中创建新会话,才能以不同的用户身份登录。
您可以通过以下步骤限制用户不在另一个选项卡中打开URL
,
-
当用户点击
login
按钮时,请将您的server code
中的session
检查为,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>
希望这个把戏能奏效。
您可以用会话ID发送每个请求!然后通过服务器上的sessionID获取每个会话。
我以前也做过,虽然没有Java,只有JavaScript。不过,这应该适用于您的情况。
标准方法
你遇到的问题是。。。你使用的是cookie,这是允许某人登录一次,然后进入任何一个选项卡仍然登录的标准方法。在大多数情况下,这是最好的方法。但是,请记住,每次点击都会将cookie发送到服务器,如果您有CSS、JS、IMG等非公共数据,这可能非常重要。
单独会话
为了将每个选项卡(页面(区分为单独的会话,您所做的是在页面中使用会话标识符,而不是使用cookie。(您可能需要两者都允许私人数据,如前所述。(
这在可以轻松创建隐藏<input>
标签的表单中效果良好:
<input type="hidden" name="session" value="123"/>
这假设你是动态生成页面的,所以每次有人点击该页面时,你都会给他们一个新的会话(实际上,你应该有一个特殊的登录页面来获取会话,然后导航到显示绝密数据的重要页面…(
但是,您会发现…you负责在任何地方手动携带该会话标识符。这可能非常乏味(即NO任何地方的直接链接都有效,因为点击一个简单的锚链接的人不会发送特殊的会话,除非你在查询字符串中添加它作为参数…或类似的东西。但会话在URL中是可见的。因此,使用类似jQuery((的东西,你必须捕获每个链接,如果点击,你实际上"POST a redirect"。正如我所说,这是一项相当艰巨的工作!(
还要注意的是,一旦用户关闭了这样一个页面,就他而言,他就已经注销了。但是,该会话在服务器上仍然处于活动状态。要真正让用户注销,您必须使用onclose
事件,并确保向服务器发送一个快速通知,要求取消会话。
混合方法
使用这两种方法:隐藏输入(或者任何你想要的标签,用jQuery代码很容易检索(和cookie,你可能会有更好的运气。也就是说,您可能知道用户是使用cookie"半登录"的。然而,如果没有会话标识符,就不会显示某些其他绝密数据。
- 访问布局信息是否也会导致浏览器重排
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 有时数据是't显示在浏览器中
- 使图像在单击时展开到不大于浏览器
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- fetch() 函数未在 Ubuntu Chromium 浏览器上定义
- 在节点和浏览器中加载单个javascript模块
- 自定义右键单击UI上下文菜单(复制、粘贴、剪切)用于整个应用程序(所有网页)跨所有浏览器而非单个网页
- 在浏览器中使用javascript将HTML页面的所有外部资源嵌入到单个文件中
- 如何从浏览器中删除单个Cloudinary图像
- 将单个浏览器的js代码拆分成原始文件
- 针对浏览器和NodeJS的单个函数模块的语法
- 如何在模板标签中找到元素,需要在单个解决方案中支持所有浏览器
- 使单个页面的浏览器缓存无效
- 浏览器为单个cookie名称-值对保留多个值
- 浏览器如何定义源HTML中的哪些字符,在呈现的HTML中折叠为单个空白?那么s正则表达式呢?
- 浏览器脚本是否强制要求在单个线程上运行
- 如何确保javascript单页应用程序只能在单个浏览器选项卡上执行
- 如何使用Java将会话限制为单个浏览器选项卡