java中Token驗證
阿新 • • 發佈:2019-02-03
突然發現這篇博文的瀏覽器已經破三千了,我覺得還是有必要提一下,在實際的工作專案中,如果採用這種方法的話,
可能程式碼量會比較多,很繁瑣,但優點是對於新人可能是更好的去理解吧(至少我最初是這麼認為的)。
這裡我推薦一篇博文吧,很簡便:Spring MVC攔截器+註解方式實現防止表單重複提交
-----tag-----
什麼是Token:它是一個令牌,隨機不可預測的。
為什麼需要使用Token:1,防止表單的重複提交
2:,防止跨站點的請求偽造
Token的使用流程是:首先在伺服器端生成一個隨機的token值並在伺服器端儲存起來,然後向客戶端請求的過程中把這個Token值傳過去。之後頁面操作完畢後向伺服器提交資料的過程中又把這個Token值傳回伺服器端,同時比較這個Token值是否已經存在於伺服器端,若存在,則此次訪問是安全的,並在伺服器端把這個Token值刪除,若不存在,則此次訪問無效。
好,瞭解Token的用法之後來看程式碼(專案中可直接貼上使用)
---------------------------------------------------------------------以下為轉載的程式碼:
(一)首先是Token工具類
package com.company.util; import java.util.ArrayList; import javax.servlet.http.HttpSession; public class Token { private static final String TOKEN_LIST_NAME = "tokenList"; public static final String TOKEN_STRING_NAME = "token"; private static ArrayList getTokenList(HttpSession session) { Object obj = session.getAttribute(TOKEN_LIST_NAME); if (obj != null) { return (ArrayList) obj; } else { ArrayList tokenList = new ArrayList(); session.setAttribute(TOKEN_LIST_NAME, tokenList); return tokenList; } } private static void saveTokenString(String tokenStr, HttpSession session) { ArrayList tokenList = getTokenList(session); tokenList.add(tokenStr); session.setAttribute(TOKEN_LIST_NAME, tokenList); } private static String generateTokenString(){ return new Long(System.currentTimeMillis()).toString(); } /** *//** * Generate a token string, and save the string in session, then return the token string. * @param HttpSession session * @return a token string used for enforcing a single request for a particular transaction. */ public static String getTokenString(HttpSession session) { String tokenStr = generateTokenString(); saveTokenString(tokenStr, session); return tokenStr; } /** *//** * check whether token string is valid. if session contains the token string, return true. * otherwise, return false. * @param String tokenStr * @param HttpSession session * @return true: session contains tokenStr; false: session is null or tokenStr is id not in session */ public static boolean isTokenStringValid(String tokenStr, HttpSession session) { boolean valid = false; if(session != null){ ArrayList tokenList = getTokenList(session); if (tokenList.contains(tokenStr)) { valid = true; tokenList.remove(tokenStr); } } return valid; } }
(二)JSP頁面中
1:先import該Token工具類
<%@ page import="com.company.util.Token" %>
2:在表單中新增隱藏的Token值
<form>
<input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">
</form>
(三)在伺服器端Servlet中新增如下程式碼
if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){ //To Do 業務程式碼 }