如何使用Java将会话限制为单个浏览器选项卡

How can I use Java to restrict the session to a single browser tab

本文关键字:单个 浏览器 选项 何使用 Java 会话      更新时间:2023-09-26

我不希望用户的HTTP会话在浏览器选项卡之间共享。

例如,如果用户在选项卡一中登录到系统,他可以看到他的所有配置文件详细信息。但是,当从另一个新选项卡(选项卡二(中找到相同的URL时,它也会显示相同的用户配置文件详细信息。

我想将用户会话限制为仅打开第一个选项卡。如果打开了另一个选项卡,则不应使用第一个选项卡的会话。有什么办法可以做到这一点吗?

您不能为浏览器中的每个选项卡创建不同的会话

以下方式用于限制用户在浏览器的另一个选项卡中再次login相同的应用程序。

这对我有效。

IE中,您必须在浏览器中创建新会话,才能以不同的用户身份登录。

您可以通过以下步骤限制用户不在另一个选项卡中打开URL

  1. 当用户点击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"半登录"的。然而,如果没有会话标识符,就不会显示某些其他绝密数据。