原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。
注解Token代码:
@Target
(ElementType.METHOD)
@Retention
(RetentionPolicy.RUNTIME)
public
@interface
Token {
boolean
save()
default
false;
boolan
remove()
default
false
;
}
拦截器TokenInterceptor代码:
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)) {
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
;
}
}
然后在Spring MVC的配置文件里加入:
<!-- 拦截器配置 -->
<
mvc:interceptors
>
<!-- 配置Token拦截器,防止用户重复提交数据 -->
<
mvc:interceptor
>
<
mvc:mapping
path
=
"/**"
/>
<
bean
class
=
"com.storezhang.web.spring.TokenInterceptor"
/>
</
mvc:interceptor
>
</
mvc:interceptors
>
关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码:
<input type="hidden" name="token" value="${token}" />
相关推荐
SpringMVC中基于Token防止表单重复提交方法 SpringMVC中基于Token防止表单重复提交方法是指通过在SpringMVC配置文件中添加拦截器配置,来拦截页面请求和表单提交请求,以防止表单重复提交。下面是该方法的实现思路...
总结来说,Servlet、Struts和SpringMVC都提供了各自的解决方案来防止表单重复提交,主要方法包括使用Session、令牌机制、重定向和拦截器等。开发者可以根据项目需求选择合适的方式来实现,确保应用的稳定性和数据...
总的来说,"Token-SpringMVC"是Spring MVC框架中防止重复提交的一种实用策略,它通过令牌验证确保了请求的唯一性,从而保护了系统的数据一致性。在实际开发中,我们需要根据项目需求和安全级别来选择合适的防止重复...
- 在业务逻辑执行完毕后,需要清除session中的token,防止因为浏览器回退导致的重复提交。这通常在控制器方法的最后执行,或者在拦截器的`postHandle()`或`afterCompletion()`方法中完成。 5. **标签实现**: - ...
在SSM(Spring、SpringMVC、MyBatis)开发框架中,结合注解和拦截器,可以有效地实现表单重复提交的验证。下面将详细介绍这个过程。 首先,我们需要理解什么是Token。Token是一种安全机制,它通常是一段随机生成的...
在 WebMvcConfigurer 中,我们可以重写 addInterceptors 方法来添加拦截器,以防止表单重复提交。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void ...
常用于处理表单提交后的跳转,避免重复提交。 5. **响应JSON数据**: - **过滤静态资源**:SpringMVC的DispatcherServlet默认会拦截所有请求,包括静态资源(如图片、CSS、JavaScript)。为防止这种情况,可以在`...
国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...
在实际应用中,我们还需要考虑安全性问题,如验证文件类型、大小以及防止重复上传。同时,为了提高用户体验,可以使用预览功能,让用户在上传前就能看到所选图片。 总结,SpringMVC结合jQuery的ajaxSubmit实现了...
Java-Base64算法_创新_防止表单重复提交 JAVA企业级基础课题(HashMap那些事) 企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级...
- 为了提高用户体验,可以使用SpringMVC的`@ExceptionHandler`处理注册过程中的异常,如数据重复、空指针异常等。 - 异常处理方法可以返回一个ModelAndView对象,将错误信息放入模型中,然后重定向回注册页面,...
登录成功后,可以使用RedirectAttributes进行重定向,以防止表单重复提交。 **8. CSRF防护** 为了增强安全性,还需要考虑跨站请求伪造(CSRF)攻击的防护。Spring Security默认提供了CSRF保护,可以通过配置关闭或...
总的来说,Spring MVC中的重定向和Flash Attributes机制为开发者提供了一种安全、方便的方式来处理表单提交和防止重复提交。通过正确使用`RedirectAttributes`和`addFlashAttribute`,可以在重定向过程中传递参数,...
MyBatis 提供了 SQL 映射功能,使得开发者可以直接编写 SQL 语句,避免了传统的 JDBC 编程中大量重复的代码。它允许开发者将 SQL 语句与 Java 代码分离,使得 SQL 语句更加易读、易维护。 - **XML 映射文件**:在...
Struts2提供了防止表单重复提交的机制,可以通过令牌机制来实现。 ##### 9.11 Struts中Result标签 Struts2的`<result>`标签用于定义请求处理后的结果页面。 以上内容概述了Java开发中常用的几个框架的基本概念和...
令牌机制防止表单重复提交。 注册表单的JS验证、Ajax用户名唯一性验证等等。 开发环境: jdk1.8+Tomcat 9+Mysql 5.7+Eclipse(本人用Oracle也做了一版,上传的程序是用的Mysql版) 项目功能模块: 用户注册、登录、...
在本系统中,表单非空验证确保用户输入了所有必需的信息,而重复验证则防止了如用户名、邮箱等唯一标识符的冲突。SpringMVC提供了注解驱动的验证机制,如`@NotBlank`、`@Email`等,可以方便地在控制器方法参数上应用...
文件上传后,我们可能需要对文件进行重命名,以防止重复文件名或者安全考虑。可以使用`java.io.File`类的`renameTo()`方法进行重命名操作。重命名时应确保新文件名的唯一性和合法性,例如,可以添加时间戳或者随机...
4. **防止表单重复提交**:为了避免用户误操作或恶意多次提交表单,可以使用Spring MVC的拦截器或JavaScript来实现表单的防重提交机制。 5. **发送验证码**:通常用于增强账户安全性,例如在注册或找回密码时。...
本文档将深入探讨dingframeworkMVC的核心概念、配置方法以及关键特性,包括HelloWorld示例、配置细节、文件上传处理、表单数据验证、国际化支持、拦截器机制以及防止重复提交等功能。 #### 一、dingframeworkMVC...