2017-03-13 33 views
2

1.如何在同一瀏覽器的下一個標籤中查找您的網站? 2.如何防止在第二個選項卡中打開網站?如何在特定會話中跟蹤特定瀏覽器的網站

+1

我不相信有辦法做到這一點。出於明顯的安全原因,瀏覽器不允許JS訪問有關其他打開標籤的信息。 – Carcigenicate

+0

可能是不可能的,除非您以某種方式訪問​​到服務器的原始客戶端連接,但即使如此,HTTP連接通常也是無狀態的,並且連接立即關閉。 – xander

+0

那麼銀行網站如何不允許複製下一個標籤中的網址。 –

回答

2

如果瀏覽器首先調用您的站點,您將在服務器端創建一個會話,這會導致將會話cookie發送到瀏覽器。在你的HTML中,你可以嵌入一個隱藏的表單值。這個隱藏的值必須包含在每個後續的調用中。最好是始終使用POST,以便隱藏的值不包含在URL中。

如果用戶打開第二個選項卡並希望打開您的站點的URL,則不包含隱藏參數,但第一個選項卡中的會話Cookie爲。

所以在服務器端,你知道已經有一個會話,但隱藏的值是缺失的。所以你可以發送完全不同的迴應。

更新 這裏有個小例子。

在web內容文件夾中有一個子文件夾protected。所有包含的JSP文件只能在一個選項卡中打開。這裏只有MyJsp.jsp

在根文件夾中有兩個JSP:error.jsp當有人試圖在第二個選項卡中打開受保護的JSP時顯示。和index.jsp其中重定向到protected/MyJsp.jsp

還有一個映射到protected文件夾的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> 

這個JSP是要求一個名稱。表單通過POST提交調用相同的JSP。隱藏字段中充滿了來自會話的值。

index.jsp

<%@ 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"); 
     } 
    } 
    } 

    // ... 
} 

試一試!

+0

,但是如果我們開始從服務器處理每個頁面,它就不會讓我們的網站變慢,但它必須進行一次兩次服務器調用,以確保它在獲取細節時有效。 –

+1

如果您仔細閱讀,您會看到只有一個請求 –

+0

它不會使請求數量加倍。處理每個呼叫的額外隱藏參數的性能損失最小。對於每個請求,服務器必須檢查是否存在此參數。而已。 – vanje

相關問題