原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。
新建注解:Token.java
package gov.saxmz.one.controller;
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;
}
新建拦截器:TokenInterceptor.java
package gov.saxmz.one.controller;
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)) {
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.xml中配置 :
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="gov.saxmz.one.controller.TokenInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在相关方法中加入注解:
在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
在jsp页面中加入 :
<input type="hidden" name="token" value="${token}">
- 浏览: 5071 次
- 性别:
- 来自: 西安
相关推荐
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...