javascript
java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)
這篇博文介紹第一種方法:判斷session或其他緩存中保存的token,這里以session為例,具體大家也可以自行擴展以其他的緩存實現。
這種方式比較麻煩,每次在提交表單時都必須傳入上次的token。而且當一個頁面使用ajax時,多個表單提交就會有問題。
1、自定義注解FormToken
注解的作用主要是用來標識哪些類需要被攔截,處理防重復提交的問題,具體代碼如下:
package io.mykit.filter.spring.repeat.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 以Token注解形式方式重復提交內容
* @author liuyazhuang
*
*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FormToken {
boolean save() default false;
boolean remove() default false;
}
2、創建攔截器類FormTokenInterceptor
這個類主要是對標識了@FormToken的方法進行攔截,并且按照相應的規則進行處理,FormTokenInterceptor不進行具體的規則處理,具體規則交由子類實現。具體代碼如下:
package io.mykit.filter.spring.repeat.interceptor;
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;
import io.mykit.filter.spring.repeat.annotation.FormToken;
/**
* 基于Token形式的防重復提交攔截器
* @author liuyazhuang
*
*/
public abstract class FormTokenInterceptor 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();
FormToken annotation = method.getAnnotation(FormToken.class);
if (annotation != null) {
boolean needSaveSession = annotation.save();
if (needSaveSession) {
request.getSession(false).setAttribute("formToken", UUID.randomUUID().toString());
}
boolean needRemoveSession = annotation.remove();
if (needRemoveSession) {
if (isRepeatSubmit(request)) {
return false;
}
request.getSession(false).removeAttribute("formToken");
}
}
return true;
} else {
return super.preHandle(request, response, handler);
}
}
/**
* 具體規則交由子類實現
* @param request
* @return
*/
public abstract boolean isRepeatSubmit(HttpServletRequest request);
}
3、創建具體規則實現類MyFormTokenInterceptor
這個類繼承FormTokenInterceptor類,實現isRepeatSubmit方法來提供具體的處理規則,這個類也是本例提供的處理方式,如果大家想用其他的處理方式,可自行定義處理類繼承FormTokenInterceptor,實現isRepeatSubmit方法即可,這也體現了本實例的高可擴展性。具體代碼如下:
package io.mykit.filter.spring.repeat.interceptor.impl;
import javax.servlet.http.HttpServletRequest;
import io.mykit.filter.spring.repeat.interceptor.FormTokenInterceptor;
/**
* 具體規則的實現,這種方式頁面需要添加
*
* @author liuyazhuang
*
*/
public class MyFormTokenInterceptor extends FormTokenInterceptor {
@Override
public boolean isRepeatSubmit(HttpServletRequest request) {
String serverToken = (String) request.getSession(false).getAttribute("formToken");
if (serverToken == null) {
return true;
}
String clinetToken = request.getParameter("formToken");
if (clinetToken == null) {
return true;
}
if (!serverToken.equals(clinetToken)) {
return true;
}
return false;
}
}
4、配置springmvc-interceptor.xml文件
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
5、具體使用
在相關的web工程中的springmvc配置文件中引入springmvc-interceptor.xml文件
如下:
當你自己繼承FormTokenInterceptor類實現了具體的攔截規則時,就不能在相關的web工程中的springmvc配置文件中引入springmvc-interceptor.xml文件了,需要添加如下配置
然后在接口的方法上加上注解即可。在需要生成token的controller上增加@FormToken(save=true),而在需要檢查重復提交的controller上添加@FormToken(remove=true)就可以了。
另外,你需要在view里在form里增加下面代碼:
注意在ajax提交時 要加上 formToken參數
6、附上pom.xml依賴配置
UTF-8
javax.servlet
javax.servlet-api
3.0.1
cglib
cglib
3.2.6
com.alibaba
fastjson
1.2.47
org.springframework
spring-expression
${spring.version}
org.springframework
spring-messaging
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-web
${spring.version}
org.aspectj
aspectjtools
1.9.1
org.springframework
spring-webmvc
${spring.version}
總結
以上是生活随笔為你收集整理的java mvc中重复提交_SpringMVC之——防止重复提交表单的方法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10更新失败,怎么删除临时文件下面
- 下一篇: mysql 重启_mysql重启的问题