JSP 防止重複提交方法

在處理JSP頁面重複提交之前,首先要明白request和session的概念.並且很清晰的知道他們各自的工作原理.

Session,存在於服務器端的內寸中,當客戶端發送request到服務端,包含的session信息爲sessionId. request.getSession().這個方法是經常使用的一個方法,但是它並不是表示session就存在於request中,而是request通過sessionId從服務器的內寸中取得session這個對象.
還有一個方法,session.setAttribute(),這個方法,是把一個對象保存到了客戶端了麼?沒有,這個方法只把對象保存在了服務端的內存中.
從這裏就很清晰的明白了一個道理,在session中的對象不一定會在request中存在,而request中的對像也不一定會在session中存在.

接下來來說防止重複提交的原理:
說簡單點,防止重複提交的原理就是在服務端和在客戶端同時存在一個Token,當客戶端發送一個request到服務端的時候,包含這個token的信息,當然,這個請求同樣會包含當前的sessionID,
當請求到達服務端的時候,服務端用過sessionID去得到當前的session,並且在該session中查找改Token,並且與request中所包含的Token進行比較,如果相同責爲有效請求,在請求有效之前從session將該Token刪除,這樣,如果重複提交,則爲無效請求.

用一段代碼來表示吧.
首先定義兩個變量

public static String TOKEN_FOR_SESSION="token.for.session";
public static String TOKEN_FOR_REQUEST="token.for.request";

這兩個字段不需要太多的解釋.

考慮add這個方法需要防止重複提交,因此在add發出的這個request的時候,一定需要包含這個TOKEN,
因此,需要增加一個toAdd這樣一個方法,在這個方法中,轉向add這個頁面,而toAdd這個方法中的概要代碼:
String token=getToken();
request.setAttribute(TOKEN_FOR_REQUIRED,token);
session.setAttribute(TOKEN_FOR_SESSION,token);
request.getRequestDispatcher("/add.jsp").forward(request,response);
對於這段代碼也不需要太多的解釋

在add.jsp中包含如下信息:
<input type="hidden" value="${token.for.request}"/>

在add的action處理中:

String savedToken=request.getSession().getAttribute(TOKEN_FOR_SESSION).toString();
String requestToken=request.getParameter(TOKEN_FOR_REQUEST);

request.getSession().removeAttribute(TOKEN_FOR_SESSION);
if(savedToken.equals(requestToken))
{
    //TODO:your own business logic.
}

這個就是防止重複提交的概要思想.   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章