2011-03-16 57 views
1

在我的JSP webapp中,我想驗證用戶來自我的特定頁面http://myapplication.com/foo.jsp。做檢查的頁面,我可以這樣做:JSP驗證用戶來自上一頁

String ref = request.getHeader("referer"); 

然後比較refhttp://myapplication.com/foo.jsp

然而,這種驗證很容易被欺騙。還有哪些其他技術來驗證客戶端是否來自預期的URL?

我想這已經出現在SO中。 感謝

PR

回答

1

讓第一個JSP的預處理servlet生成一個唯一標記。

String token = UUID.randomUUID().toString(); 

這些信息存儲在會話

session.setAttribute("token", token); 

把它當作形式

<input type="hidden" name="token" value="${token}" /> 

或作爲鏈接的請求參數的隱藏輸入值,當你'使用鏈接而不是表格

<a href="second.jsp?token=${token}">link</a> 

讓第二JSP的預處理的servlet與一個會話

String token = (String) session.getAttribute("token"); 
session.removeAttribute("token"); 

if (token != null && token.equals(request.getParameter("token"))) { 
    // Valid, continue requesst. 
} else { 
    // Invalid, block request. 
} 

這是基本的概念,假定一個單頁到頁面進行比較會話。要覆蓋多個瀏覽器頁面/標籤,您希望使用Set<String>Map<String, Set<String>>作爲標記(將URI作爲鍵和標記作爲值)。

0

,以真正做到的唯一方法是存儲在會話中的「上次訪問頁面」。這樣它就不會傳輸給客戶端,或者可能被請求的頭部所欺騙。

這個想法是,在返回的jsp中,它更新當前會話中的「最後一頁訪問」屬性。然後在頁面的早期處理中,對「last page visited」屬性進行檢查。

當然,這不適用於Web服務器,除非它們被配置爲共享會話信息。