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

时间:2014-03-12 07:15:42

标签: java javascript html java-ee

我不希望在浏览器标签之间共享用户的HTTP会话。

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

我想将用户会话限制为仅打开的第一个标签。如果打开另一个选项卡,则不应使用第一个选项卡的会话。有什么方法可以实现这一目标吗?

3 个答案:

答案 0 :(得分:0)

您无法为浏览器中的每个标签创建不同的会话。

以下方式用于限制用户再次login浏览器另一个标签中的同一个应用程序。

这对我有用。

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

您可以通过以下步骤限制用户不要在其他标签页中打开URL

  1. 当用户点击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");
        }
    
    }
    
  2. 您的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“半登录”。但是,如果没有会话标识符,则不会显示某些其他绝密数据。