Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在特定会话中跟踪特定浏览器的网站_Javascript_Java_Jsp_Cookies_Session Cookies - Fatal编程技术网

Javascript 如何在特定会话中跟踪特定浏览器的网站

Javascript 如何在特定会话中跟踪特定浏览器的网站,javascript,java,jsp,cookies,session-cookies,Javascript,Java,Jsp,Cookies,Session Cookies,1.如何在同一浏览器的下一个选项卡中找到您的网站? 2.如何防止在第二个选项卡中打开网站?如果浏览器首先调用您的网站,您将在服务器端创建会话,从而将会话cookie发送到浏览器。在HTML中,可以嵌入隐藏的表单值。此隐藏值必须包含在每次后续调用中。最好是使用AlwaysPost,这样隐藏的值就不会包含在URL中 如果用户打开第二个选项卡并希望打开站点的URL,则不包括隐藏参数,但第一个选项卡中的会话cookie将被删除 所以,在服务器端,您知道已经有一个会话,但是隐藏值丢失了。所以你可以发送一个

1.如何在同一浏览器的下一个选项卡中找到您的网站?
2.如何防止在第二个选项卡中打开网站?

如果浏览器首先调用您的网站,您将在服务器端创建会话,从而将会话cookie发送到浏览器。在HTML中,可以嵌入隐藏的表单值。此隐藏值必须包含在每次后续调用中。最好是使用AlwaysPost,这样隐藏的值就不会包含在URL中

如果用户打开第二个选项卡并希望打开站点的URL,则不包括隐藏参数,但第一个选项卡中的会话cookie将被删除

所以,在服务器端,您知道已经有一个会话,但是隐藏值丢失了。所以你可以发送一个完全不同的回复

更新 这里有一个小例子

在web内容文件夹中有一个子文件夹
受保护
。所有包含的JSP文件只能在一个选项卡中打开。这里只有
MyJsp.jsp

在根文件夹中有两个jsp:
error.jsp
,当有人试图在第二个选项卡中打开受保护的jsp时,会显示这两个jsp。和
index.jsp
,它重定向到
protected/MyJsp.jsp

还有一个servlet过滤器映射到
受保护的
文件夹。在执行此文件夹中的JSP之前,将调用此筛选器

protected/MyJsp.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <p>Hello,
    <c:choose>
    <c:when test="${not empty param.name}">
      <c:out value="${param.name}" />.
    </c:when>
    <c:otherwise>
      stranger.
    </c:otherwise>
    </c:choose>
  </p>
  <form method="post">
    <label>Please enter your name</label>
    <input id="name" name="name" type="text"/>
    <input id="marker" name="marker" type="hidden" 
        value="<c:out value="${sessionScope.marker}"/>"/>
    <button type="submit">OK</button>
  </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!--include the library-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:redirect url="protected/MyJsp.jsp"/>
servlet过滤器:

@WebFilter("/protected/*")
public class OneTabFilter implements Filter {

  private static final String MARKER_NAME = "marker";
  private static final String MARKER_VALUE = "4711*0815";

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest req = (HttpServletRequest) request; 
    final HttpServletResponse rsp = (HttpServletResponse) response;
    HttpSession session = req.getSession(false);
    if(session == null) {
      session = req.getSession(true);
      // Put the marker value into session so it is usable in JSP files.
      session.setAttribute(MARKER_NAME, MARKER_VALUE);
      // pass the request along the filter chain
      chain.doFilter(request, response);
    } else {
      if(MARKER_VALUE.equals(req.getParameter(MARKER_NAME))) {
        // pass the request along the filter chain
        chain.doFilter(request, response);
      } else {
        // Redirect to the error page.
        // The error page itself is not affected by this filter.
        rsp.sendRedirect(req.getServletContext().getContextPath() + "/error.jsp");
      }
    }
  }

  // ...
}

你自己试试吧

我不相信有办法做到这一点。出于明显的安全原因,浏览器不允许JS访问关于其他打开选项卡的信息。这可能是不可能的,除非您能够以某种方式访问到服务器的原始客户端连接,但即便如此,HTTP连接通常是无状态的,并且连接会立即关闭。那么银行网站如何不允许在下一个选项卡中复制url。@Carcigenitate任何服务器端解决方案?@SunandanBose银行网站通常只使用HTTPS,所以大多数时候你甚至不能使用HTTP“浏览器的导航按钮返回或刷新页面,这将使会话无效。但是,如果我们从服务器开始处理每一个页面,我们的网站不会变慢吗?它必须进行两次服务器调用,以确保第二次获取详细信息是有效的。这不会使请求数增加一倍。”。在处理每个调用的附加隐藏参数时,性能损失最小。对于每个请求,服务器都必须检查是否存在此参数。就是这样。也许这个检查可以通过Servlet过滤器实现。@Sunandan Bose:我用一个例子更新了我的答案。