一:首先创建一个token处理类  ,这里的类名叫 TokenHandler

private static Logger logger = Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token = new HashMap<String, String>();//生成一个唯一值的token@SuppressWarnings("unchecked")public synchronized static String generateGUID(HttpSession session) {String token = "";try {Object obj =  session.getAttribute("SPRINGMVC.TOKEN");if(obj!=null)springmvc_token = (Map<String,String>)session.getAttribute("SPRINGMVC.TOKEN");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 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();Map<String, String> tokenMap = (Map<String, String>)           session.getAttribute("SPRINGMVC.TOKEN");if (tokenMap == null || tokenMap.size() < 1) {logger.warn("token is not valid!sessionToken is NULL");return false;}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;}//获取表单中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;}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.");return null;}return tokens[0];}

二: 自己实现一个自定义标签 这里我自定义的标签叫: <dy:token/> 页面中使用如下:

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

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

index.jsp!!!

<%@ taglib prefix="dy" uri="/dy-tags"%>
<html><head><title>spring mvc</title></head><body>       welcome to spring mvc!<br/><form name="mvcForm" action="indexSubmit.do" method="post"><dy:token/>username: <input name="username" type="text" value="${user.username}"/>password: <input name="password" type="text" value="${user.password}"/>email: <input name="email" type="text" value="${user.email}"/><input type="submit" value="提交"></form></body>
</html>

三 :这是我用到的常量:

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;}
}

六:这下面是spring拦截器配置:

<mvc:interceptor><mvc:mapping path="/index.do" />-->这个请求返回的是你有token的页面<bean class="com.dengyang.interceptor.TokenHandlerInterceptor" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/indexSubmit.do" />-->这个是提交请求<bean class="com.dengyang.interceptor.TokenValidInterceptor" /></mvc:interceptor>

转载于:https://blog.51cto.com/6230217/1244757

SpringMVC中实现的token,防表单重复提交相关推荐

  1. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...

  2. python表单防重复提交_关于PHP使用token防止表单重复提交的方法

    这篇文章主要介绍了PHP使用token防止表单重复提交的方法,通过生成一个加密后的随机数存入session的token变量,同时将该值放入表单隐藏提交,达到防止表单重复提交的功能,需要的朋友可以参考下 ...

  3. redis防表单重复提交

    参考链接: 防表单重复提交的四种方法:https://www.cnblogs.com/huanghuizhou/p/9153837.html 补充几点个人想法: 1. 对于前后端传递token验证的方 ...

  4. php token 表单重复提交,PHP生成token防止表单重复提交2个例子

    防止表单重复提交的解决方案非常的简单,我们下面两个例子都是生成一个随机的token验证用户是不是由我们站内提交并且进行重复验证即可实现了. 在网上搜索了一下有很多站长都这样说的 1.提交按钮置disa ...

  5. validate中submitHandler采用ajaxsubmit导致表单重复提交

    validate中submitHandler采用ajaxsubmit导致表单重复提交 在这几日的表单验证实践中,由于我的三个form都放在一个页面上,所以在submit上采用的是ajax方式来提交表单 ...

  6. Spring Boot中防表单重复提交以及拦截器登录检测

    目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...

  7. struts2 自带的 token防止表单重复提交拦截器

    在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name=&quo ...

  8. token防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  9. 基于拦截器实现防表单重复提交

    1.定义自定义注解 2.定义防重复提交拦截器 /*** 防止重复提交拦截器** */ @Component public abstract class RepeatSubmitInterceptor ...

最新文章

  1. Python中获取异常(try Exception)信息
  2. 常用作图与图片处理工具
  3. linux下汇编实例
  4. 处理Request 的方法中的形参务必加上@RequestParam 注解
  5. Ajax-基础篇(02)
  6. python官方的扩展索引_Python列表操作与深浅拷贝(6)——列表索引、查询、修改、扩展...
  7. 电脑鸿蒙运行Linux程序,Linux下的Hi3861一站式鸿蒙开发烧录(附工具)-鸿蒙开发烧录工具软件电脑版-东坡下载...
  8. oracle免费云攻略,使用免费的Oracle云服务-创建云主机
  9. JEECG - 基于代码生成器的J2EE智能开发框架 续二: 代码生成器使用规则
  10. python存文件代码_Python文件读写保存操作的示例代码
  11. Kubernetes 常见运维技巧总结
  12. Property “pageNumber“ was accessed during render but is not defined on instance.
  13. 中国成品油价为啥会比美国贵30%?
  14. uniapp-mixpanel用户行为分析埋点统计插件
  15. CSDN学霸课表——把Word的默认背景颜色由白色改为绿色
  16. 哈工大2019年春算法设计与分析期末复习
  17. JavaWeb - 软件开发的流程,综合案例
  18. XML文件怎么添加注释
  19. 计算机网络实验:实验三 路由器的基本配置
  20. 飞信短信接口php,用PHP实现飞信api接口发飞信短信

热门文章

  1. MYSQL 查询数据排序数据和分组数据
  2. 用WinForm/WPF代码来为.NET Core 3.0功能投票
  3. 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式
  4. 【TP3.2】路由匹配和规则
  5. 《JavaScript面向对象精要》读书笔记
  6. 私有云管理-Windows Azure Pack
  7. 坐班族如何摆脱粗壮大腿
  8. nvm npm不是内部命令_npm作弊表-最常见的命令和nvm
  9. 快速了解Kubernetes微服务中的通信
  10. Vue3 计算属性的特性