先參考這3篇博文
http://blog.csdn.net/gideal_wang/article/details/4189694
http://developer.51cto.com/art/201311/417014.htm
http://www.cnblogs.com/xdp-gacl/p/3859416.html
下面通過注解和攔截器來實現該功能:
package com.nasuxwx.plug.web.formtoken;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 驗證form表單重復提交注解 * @title FormToken.java * @since 2015年11月13日 */@Documented@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface FormToken { /** * 是否移除formToken參數,默認false:不移除 * @title isRemove * @author dinggh * @since 2015年11月13日 * @return */ boolean isRemove() default false; /** * 是否添加formToken參數,默認false:不添加 * @title isAdd * @author dinggh * @since 2015年11月13日 * @return */ boolean isAdd() default false;}package com.nasuxwx.plug.web.formtoken;import java.io.PRintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import com.nasuxwx.plug.util.FormTokenProccessor;/** * 驗證form表單重復提交 * @title FormTokenInterceptor.java * @since 2015年11月13日 */public class FormTokenInterceptor extends HandlerInterceptorAdapter{ private Logger logger = LoggerFactory.getLogger(FormTokenInterceptor.class); /** * 驗證form表單重復提交,如果未重復提交則移除session中的formToken */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { FormToken preFormToken = ((HandlerMethod) handler).getMethodAnnotation(FormToken.class); //聲明需要防止表單重復提交,并且需要移除參數 if (preFormToken!=null&&preFormToken.isRemove()) { String formToken = (String) request.getSession().getAttribute("formToken"); String clientFormToken = request.getParameter("formToken"); boolean isRepeatSubmit = false; if (StringUtils.isBlank(formToken)) { isRepeatSubmit = true; } if (StringUtils.isBlank(clientFormToken)) { isRepeatSubmit = true; } if (StringUtils.isNotBlank(clientFormToken)&&!clientFormToken.equals(formToken)) { isRepeatSubmit = true; } if (isRepeatSubmit) { logger.info("form表單重復提交!" + request.getServletPath()); response.reset(); PrintWriter out = response.getWriter(); out.print("FORM_REPEAT_SUBMIT"); out.flush(); out.close(); request.getSession().setAttribute("formValid", false); return false; }else { request.getSession().removeAttribute("formToken"); } } } return super.preHandle(request, response, handler); } /** * 設置formToken到session中 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { FormToken preFormToken = ((HandlerMethod) handler).getMethodAnnotation(FormToken.class); //聲明需要防止表單重復提交,并且需要添加參數 if (preFormToken!=null&&preFormToken.isAdd()) { String formTokenStr = FormTokenProccessor.getInstance().makeToken(); request.getSession().setAttribute("formToken", formTokenStr); } } super.postHandle(request, response, handler, modelAndView); } }package com.nasuxwx.plug.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Random;import sun.misc.BASE64Encoder;/** * form 表單驗證令牌 * @title FormTokenProccessor.java * @since 2015年11月12日 */public class FormTokenProccessor { /* *單例設計模式(保證類的對象在內存中只有一個) *1、把類的構造函數私有 *2、自己創建一個類的對象 *3、對外提供一個公共的方法,返回類的對象 */ private FormTokenProccessor(){} private static final FormTokenProccessor instance = new FormTokenProccessor(); /** * 返回類的對象 * @return */ public static FormTokenProccessor getInstance(){ return instance; } /** * 生成Token * Token:Nv6RRuGEVvmGjB+jimI/gw== * @return */ public String makeToken(){ //checkException // 7346734837483 834u938493493849384 43434384 String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + ""; //數據指紋 128位長 16個字節 md5 try { MessageDigest md = MessageDigest.getInstance("md5"); byte md5[] = md.digest(token.getBytes()); //base64編碼--任意二進制編碼明文字符 adfsdfsdfsf BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(md5); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } }}/** * 綁定銀行卡信息填寫頁面 * @title toPtpMerBindCardPage * @since 2015年10月19日 * @param page * @param request * @param model * @return */ @FormToken(isAdd=true) @RequestMapping("/toPtpMerBindCardPage.nasuxwx") public String toPtpMerBindCardPage(Integer page,HttpServletRequest request,Model model){ Site site = Context.getCurrentSite(request); String url = site.getTemplate("ump/toPtpMerBindCardPage.html"); PPUser pPUser = (PPUser) request.getSession().getAttribute("user"); String orderIdPre = request.getParameter(NasuxConstant.UMPPARAM); if (StringUtils.isBlank(orderIdPre)) { orderIdPre = request.getParameter("orderIdPre"); } model.addAttribute("orderIdPre", orderIdPre); if (pPUser!=null) { model.addAttribute("UserId", pPUser.getId()); }else { return "forward:/weixin/register.nasuxwx"; } return url; }/** * 綁定銀行卡 * @since 2015年10月19日 * @param page * @param request * @param model * @return */ @FormToken(isRemove=true) @RequestMapping("/ptpMerBindCard.nasuxwx") //@ResponseBody public String ptpMerBindCard(Integer page,HttpServletRequest request,Model model){ String url = ""; PPUser pPUser = (PPUser) request.getSession().getAttribute("user"); Map<String, String> paramMap = new HashMap<String, String>(); String cardId = request.getParameter("cardId");//用戶在頁面中輸入的綁定的銀行卡號 cardId = StringUtils.trim(cardId); paramMap.put("card_id", cardId); //String bankName = request.getParameter("bankName"); /*String msg = this.checkBankCardNo(cardId, bankName); if (!"1".equals(msg)) { return msg; }*/ String orderIdPre = request.getParameter("orderIdPre"); paramMap.put("orderIdPre", orderIdPre); url = this.umpService.ptpMerBindCard(paramMap, pPUser); return "redirect:"+url; }下面是一些JS調用驗證的方法/** * 重置formToken */function resetFormToken(){ $.Ajax({ type: "POST", url:"/formtoken/resetFormToken.nasuxwx?_t="+new Date(), data:$("#registerForm").serialize(),// 要提交的表單 success: function(msg) { if(msg){ var formTokenInputs = $("input[name='formToken']"); $.each(formTokenInputs,function(i,formTokenInput){ $(formTokenInput).val(msg); }); } } });}function validFormTokenAndSubmitForm(formToken,formName){ $.ajax({ type: "POST", url:"/formtoken/validFormToken.nasuxwx?_t="+new Date(), data:{"formToken":formToken},// 要提交的表單 success: function(msg) { if(msg&&msg=="true"){ $("#"+formName).submit(); } } });}package com.nasuxwx.plug.web.formtoken;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class FormTokenController { @FormToken(isAdd=true) @RequestMapping("/formtoken/resetFormToken.nasuxwx") @ResponseBody public String resetFormToken(HttpServletRequest request){ String formToken = (String) request.getSession().getAttribute("formToken"); return formToken; } @RequestMapping("/formtoken/validFormToken.nasuxwx") @ResponseBody public String validFormToken(HttpServletRequest request, @RequestParam(value="formToken")String clientFormToken){ String formToken = (String) request.getSession().getAttribute("formToken"); boolean isRepeatSubmit = false; if (StringUtils.isBlank(formToken)) { isRepeatSubmit = true; } if (StringUtils.isBlank(clientFormToken)) { isRepeatSubmit = true; } if (StringUtils.isNotBlank(clientFormToken)&&!clientFormToken.equals(formToken)) { isRepeatSubmit = true; } return !isRepeatSubmit?"true":"false"; }}
新聞熱點
疑難解答