原文地址:http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/
token的逻辑是,给所有的url加一个拦截器,在拦截器里面用java的UUID生成一个随机的UUID并把这个UUID放到session里面,然后在浏览器做数据提交的时候将此UUID提交到服务器。服务器在接收到此UUID后,检查一下该UUID是否已经被提交,如果已经被提交,则不让逻辑继续执行下去…
总体的步骤是:
1.添加token注解
2.创建过滤器
3.配置过滤器过滤所有请求
4.在需要生成token的controller上增加@Token(save=true)
5.在需要检查重复提交的controller上添加@Token(remove=true)
6.在数据提交表单form中增加<input type="hidden"name="token"value="${token}" />即可
添加token注解:
package com.mt.syc.token; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Token { boolean save() default false; boolean remove() default false; }
创建过滤器token过滤器:
package com.mt.syc.token; import java.lang.reflect.Method; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Token annotation = method.getAnnotation(Token.class); if (annotation != null) { boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { //这句话的意思,是让浏览器用utf8来解析返回的数据 response.setHeader("Content-type", "text/html;charset=UTF-8"); //这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859 response.setCharacterEncoding("UTF-8"); response.getWriter().print("请不要频繁操作"); return false; } request.getSession(false).removeAttribute("token"); } } return true; } else { return super.preHandle(request, response, handler); } } private boolean isRepeatSubmit(HttpServletRequest request) { String serverToken = (String) request.getSession(false).getAttribute("token"); if (serverToken == null) { return true; } String clinetToken = request.getParameter("token"); if (clinetToken == null) { return true; } if (!serverToken.equals(clinetToken)) { return true; } return false; } }
配置过滤器过滤所有请求:
<mvc:interceptors> <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 --> <bean class="com.mt.syc.interceptor.LoginInterceptor"></bean> <!-- 防止重复提交的过滤器 --> <bean class="com.mt.syc.token.TokenInterceptor"></bean> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors>
相关推荐
token-springMVC 防止重复提交
本篇文章主要介绍了springMVC中基于token防止表单重复提交方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
springMVC自定义防重复提交,通过标签的方式实现
Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...
SpringMVC+Mybatis实现权限管理 完整的项目案例,无论是对于新手还是已经步入程序之门的开发者来说,都是一个好的学习内容
SpringMVC的Socket实现+Java Tomcat websocket实现+Java Socket通信实现 +Java UDP通信实现。websocket_study.rar 为springMVC版本的socket实现 websocket02.rar 里面包含tomcat的websocket实现+java socket双向通信...
整合JWT,spring,springMVC,实现基于token验证 因为CSDN博客上 这篇文章好多小伙伴希望我分享一下源码, 我这边就这个功能单独拉出来写了一个小示例供大家分享。 因为这篇博客讲的是基于JWT和spring,springMVC的...
这是一款基于SpringMVC + MyBatis实现的小说系统, 目前只有wap端。 前端采用vue的框架cube-ui, 采用前后端分离的结构,系统中针对数据接口安全做了一定的限制, 很大程度上保证了数据的安全性。 这是一款基于...
Servlet、Struts、SpringMVC对于表单重复提交的解决方案
springmvc入门简单实现,基础过渡,理解springmvc的实现机制。
开发工具使用的是IDEA,使用SpringMVC+Maven实现用户登录功能,适合刚接触SpringMVC的技术。
SpringMVC精品资源--整合JWT,spring,springMVC,实现基于token验证
SpringMVC的代码简单实现,利用元注解和反射技术自己实现SpringMVC的注解功能
根据互联网大佬传授的思想源码完成的简单的SpringMVC简单底层源码,每一行加上注释,方便大家一起学习思考
SpringMVC用户管理实现 通过SpringMVC与JSP实现用户角色管理
SpringMVC详细实现教程
后台界面实时获取用户输入内容,springMVC+Ajax实现(源码)
基于bootstrap、springmvc、mybatis开发的实现登录和增删改查基本功能的项目,界面友好
最近刚学SpringMVC,项目是SpringMVC+Hibernate整合,并能实现增删改,能显示图片。里面的支持包都有,只需配置一下数据库,忘能帮助也在学习的你~
SpringMVC实现用户角色管理(springmvc角色权限管理) SpringMVC用户管理实现 通过SpringMVC与JSP实现用户角色管理 SpringMVC实现用户角色管理(springmvc角色权限管理