標籤:generate seq lang details iges article servlet 簡單 too
轉:79390980轉:78931420
AVA後端產生Token(令牌),用於校正用戶端,防止重複提交
1.概述:在web項目中,服務端和前端經常需要互動資料,有的時候由於網路相應慢,用戶端在提交某些敏感性資料(比如按照正常的商務邏輯,此份資料只能儲存一份)時,如果前端多次點擊提交按鈕會導致提交多份資料,這種情況我們是要防止發生的。
2.解決方案:
①前端處理:在提交之後通過js立即將按鈕隱藏或者置為不可用。
②後端處理:對於每次提交到背景資料必須校正,也就是通過前端攜帶的令牌(一串唯一字串)與後端校正來判斷當前資料是否有效。
3.總結:第一種方法相對來說比較簡單,但是安全係數不高,第二種方法從根本上解決了問題,所以我推薦第二種方法
** * 產生Token的工具類: */package red.hearing.eval.modules.token; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Random; import sun.misc.BASE64Encoder; /** * 產生Token的工具類 * @author zhous * @since 2018-2-23 13:59:27 * */public class TokenProccessor { private TokenProccessor(){}; private static final TokenProccessor instance = new TokenProccessor(); public static TokenProccessor getInstance() {return instance;} /** * 產生Token * @return */public String makeToken() {String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + ""; try {MessageDigest md = MessageDigest.getInstance("md5");byte md5[] = md.digest(token.getBytes());BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(md5);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} return null;}}
/** * */package red.hearing.eval.modules.token; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; /** * Token的工具類 * @author zhous * @since 2018-2-23 14:01:41 * */public class TokenTools {/** * 產生token放入session * @param request * @param tokenServerkey */public static void createToken(HttpServletRequest request,String tokenServerkey){String token = TokenProccessor.getInstance().makeToken();request.getSession().setAttribute(tokenServerkey, token);}/** * 移除token * @param request * @param tokenServerkey */public static void removeToken(HttpServletRequest request,String tokenServerkey){request.getSession().removeAttribute(tokenServerkey);}/** * 判斷請求參數中的token是否和session中一致 * @param request * @param tokenClientkey * @param tokenServerkey * @return */public static boolean judgeTokenIsEqual(HttpServletRequest request,String tokenClientkey,String tokenServerkey){String token_client = request.getParameter(tokenClientkey);if(StringUtils.isEmpty(token_client)){return false;}String token_server = (String) request.getSession().getAttribute(tokenServerkey);if(StringUtils.isEmpty(token_server)){return false;}if(!token_server.equals(token_client)){return false;}return true;}}
JAVA後端產生Token(令牌),用於校正用戶端,防止重複提交