1. 程式人生 > >java中Token驗證

java中Token驗證

突然發現這篇博文的瀏覽器已經破三千了,我覺得還是有必要提一下,在實際的工作專案中,如果採用這種方法的話,
可能程式碼量會比較多,很繁瑣,但優點是對於新人可能是更好的去理解吧(至少我最初是這麼認為的)。
這裡我推薦一篇博文吧,很簡便: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 業務程式碼
}