springmvc的token防重复提交

一:首要创立一个号码大全token处置类  ,这儿的类名叫关键词挖掘工具  TokenHandler

private static Logger logger = Logger.getLogger(TokenHandler.class);

static Map springmvc_token http://www.3h5.cn = null;

//生成一个仅有值的token

@SuppressWarnings("unchecked")

public synchronized static String generateGUID(HttpSession session http://www.fanselang.com) {

String token = "";

try {

Object obj =  session.getAttribute("SPRINGMVC.TOKEN");

if(obj!=null)

springmvc_token = (Map)session.getAttribute("SPRINGMVC.TOKEN");

else

springmvc_token = new HashMap()

token = new BigInteger(165, new Random()).toString(36)

.toUpperCase();

springmvc_token.put(Constants.DEFAULT_TOKEN_NAME + "." + token,token);

session.setAttribute("SPRINGMVC.TOKEN", springmvc_token);

Constants.TOKEN_VALUE = token;

} catch (IllegalStateException e) {

logger.error("generateGUID() mothod find http://www.4lunwen.cn bug,by token session...");

}

return token;

}

//验证表单token值和session中的token值是不是一致

@SuppressWarnings("unchecked")

public static boolean validToken(HttpServletRequest request) {

String inputToken = getInputToken(request);

if (inputToken == null) {

logger.warn("token is not valid!inputToken is NULL");

return false;

}

HttpSession session = request.getSession();http://www.zx1234.cn

Map tokenMap = (Map)           session.getAttribute("SPRINGMVC.TOKEN");

if (tokenMap == null || tokenMap.size() < 1) {http://www.penbar.cn

logger.warn("token is not valid!sessionToken is NULL");

return false;http://www.lunjin.net

}

String sessionToken = tokenMap.get(Constants.DEFAULT_TOKEN_NAME + "."

+ inputToken);

if (!inputToken.equals(sessionToken)) {

logger.warn("token is not valid!inputToken=‘" + inputToken

+ "‘,sessionToken = ‘" + sessionToken + "‘");

return false;

}

tokenMap.remove(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);

session.setAttribute("SPRINGMVC.TOKEN", tokenMap);

return true;http://www.91fish.cn

}

//获取表单中token值

@SuppressWarnings("unchecked")

public static String getInputToken(HttpServletRequest request) {

Map params = request.getParameterMap();

if (!params.containsKey(Constants.DEFAULT_TOKEN_NAME)) {

logger.warn("Could not find token name in params.");

return null;http://www.ssstyle.cn

}

String[] tokens = (String[]) (String[]) params

.get(Constants.DEFAULT_TOKEN_NAME);

if ((tokens == null) || (tokens.length < 1)) {

logger.warn("Got a null or empty token name.");http://www.wwwyoujizzcom.cn

return null;

}

return tokens[0];

}

二: 自个完成一个自定义标签 这儿我自定义的标签叫: (自定义标签的代码完成,我放csdn上了,不会的赶紧去下载,这儿我不讲了),页面中运用如下:

1:引进标签库:<%@ taglib prefix="dy" uri="/dy-tags"%>

2:jsp页面中的表单,留意加上token标签!!!如下:

index.jsp!!!

<%@ taglib prefix="dy" uri="/dy-tags"%>

spring mvc

welcome to spring mvc!

username:

password:

email:

三 :这是我用到的常量:

public static String DEFAULT_TOKEN_MSG_JSP = "unSubmit.jsp" ;

public static String TOKEN_VALUE ;

public static String DEFAULT_TOKEN_NAME = "springMVC.token";

四: 我MyController类的以下2个办法要用到token,避免表单重复提交

@RequestMapping(value = "index.do")

public String index(HttpServletRequest request) {

return "index";

}

@RequestMapping(value = "indexSubmit.do", method = RequestMethod.POST)

public String indexSubmit(User user,HttpServletRequest request) {

try {

myService.insert(user);

logger.info("info=新增成功");

} catch (Exception e) {

logger.error("exception:" + e);

}

五:以下是我拦截器的完成,留意有两个拦截器,一个生成token,一个验证token。

/**

* @Title

* @author dengyang

* @date 2013-6-4

*/

public class TokenHandlerInterceptor implements HandlerInterceptor{

public void afterCompletion(HttpServletRequest arg0,

HttpServletResponse arg1, Object arg2, Exception arg3)

throws Exception {

}

public void postHandle(HttpServletRequest request, HttpServletResponse response,

Object arg2, ModelAndView arg3) throws Exception {

TokenHandler.generateGUID(request.getSession());

}

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object arg2) throws Exception {

return true;

}

}

/**

* @Title

* @author dengyang

* @date 2013-6-4

*/

public class TokenValidInterceptor implements HandlerInterceptor{

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object arg2, Exception arg3)

throws Exception {

}

public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,

Object arg2, ModelAndView arg3) throws Exception {

}

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object arg2) throws Exception {

if(!TokenHandler.validToken(request)){

response.sendRedirect(Constants.DEFAULT_TOKEN_MSG_JSP);

return false;

}

return true;

}

}

六:ok,这下面是我的spring拦截器配置

-->这个恳求回来的是你有token的页面

-->这个是提交恳求

七:ok,整体完成原理和struts的token标签相似,有疑问请留言...

springmvc的token防重复提交

时间: 2024-10-29 11:33:46

springmvc的token防重复提交的相关文章

spring MVC 后台token防重复提交解决方案

看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018/3/9 9:22 */ public class AvoidReSubmitIntercepter extends HandlerInterceptorAdapter { private static final String SPLIT_FLAG = "_"; private stat

拦截器springmvc防止表单重复提交【1】

[参考博客:http://www.cnblogs.com/hdwpdx/archive/2016/03/29/5333943.html] springmvc 用拦截器+token防止重复提交 首先,防止用户重复提交有很多种方式,总体分为前端JS限制和后端限制,我个人认为后端限制比较妥当(本着能做到更优秀得理念,舍去了前端JS限制重复提交得想法). 之前没有做过防止用户重复提交,所以直接百度了一大堆,竟然发现基本上可以归为2到3种真正不同实现得代码,文章虽然有很多,不过大部分代码几乎都出自同一人,

(九)Struts2 防重复提交

所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:重复提交示例演示 第二节:使用<s:token/>标签防重复提交 <s:token></s:token> :加在form 里: 使用token 拦截器: <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name=

struts2学习(15)struts2防重复提交

一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交: com.cy.action.StudentAction.java: package com.cy.action; import java.io.File; import org.apache.commons.io.FileUtils; import com.cy.model.Student; import com.opensympho

防重复提交实现方案

在WEB系统操作中,往往会出现用户连续重复点击一个按钮导致重复提交,后台程序的同一个接口代码往往上一个请求还没执行完,下一个请求就到达了,而这两个请求又是请求和操作的同一条数据,就会出现业务上的逻辑错误,往往结果不可预料: 要解决重复提交带来的问题的解决方案有多种,不如网上有很多介绍怎么通过前端页面控制来解决重复提交,当然还有其他方式,这里我采用了通过后台程序代码利用redis做分布式锁的方式来防止重复提交,其思路就是在进入一个后端接口执行前先获取一个分布式锁,如果获取成功则上锁,然后执行业务代

防重复提交

// 防重复提交 定义全局变量 var checkingCorrespondflg = false; =============== 点击提交判断 if (!checkingCorrespondflg) { checkingCorrespondflg = true; } else { return false; } =============== 出错之后设置 checkingCorrespondflg = false;

struts2中token防止重复提交表单

struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年7月12日 11:52:32 星期日 http://fanshuyao.iteye.com/ 第一步:在表单中加上<s:token></s:token>

springmvc下的基于token的防重复提交

问题描述: 现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应,此时如果用户再点一次提交按钮,后台会保存多份用户信息.为解决此问题,借鉴了struts2的token思路,在springmvc下实现token. 实现思路: 在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一类是提交表单的.当转到页面的请求到来时,生成token的名字和token值,一份放到redis缓存中,一份放传

SpringMVC 防重复提交拦截

/**  * Created with IntelliJ IDEA.  * User: lijian  * Date: 14-7-11  * Time: 上午10:38  * description :防止重复提交数据     http://hi.baidu.com/uvmfawxtxzbknqe/item/3c87d4220acba32442634acf  * To change this template use File | Settings | File Templates.  */ p