如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重復提交的發生。//驗證事務控制令牌,會自動根據session中標識生成一個隱含input代表令牌,防止兩次提交。
在JSP/Servlet中可以
JSP頁面
SynchroToken.java package com.lims.util; import org.apache.struts.util.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import org.apache.struts.action.*; /** * Title: SynchroToken * Description: * Copyright: Copyright (c) 2004 * Company: NetStar * @author Jstar * @version 1.0 * Created in 2004/04/21 */ public class SynchroToken{ public final static java.lang.String TOKEN_NAME = "_token"; public static boolean checkToken (HttpServletRequest request){ boolean isEqual = false; HttpSession session = request.getSession (); String formToken = request.getParameter (TOKEN_NAME); String sessionToken = (String)session.getAttribute (TOKEN_NAME); System.out.println ("formToken: " + formToken + " sessionToken: " + sessionToken); if (formToken != null && sessionToken == null){ session.setAttribute (TOKEN_NAME, formToken); isEqual = true; } return isEqual; } /** * Insert the method's description here. * Creation date: (4/19/2004 3:23:25 PM) * @return java.lang.String * @param request javax.servlet.http.HttpServletRequest */ public static String getToken (HttpServletRequest request){ String token = "" + System.currentTimeMillis (); HttpSession session = request.getSession (); if (session != null){ session.removeAttribute (TOKEN_NAME); } return token;z } /** * Insert the method's description here. * Creation date: (4/19/2004 3:24:10 PM) * @return java.lang.String */ final static java.lang.String getTOKEN_NAME (){ return TOKEN_NAME; } public static String message (PageContext pageContext, String key) throws JspException{ return RequestUtils.message (pageContext, null, null, key); } } |