外贸企业网站评价案例,全网精准获客营销,wordpress推送到公众号,c2c平台举例这篇博文介绍第一种方法#xff1a;判断session或其他缓存中保存的token#xff0c;这里以session为例#xff0c;具体大家也可以自行扩展以其他的缓存实现。这种方式比较麻烦#xff0c;每次在提交表单时都必须传入上次的token。而且当一个页面使用ajax时#xff0c;多个…这篇博文介绍第一种方法判断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**/InheritedTarget(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)Documentedpublic 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 {Overridepublic 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 {Overridepublic 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:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd5、具体使用在相关的web工程中的springmvc配置文件中引入springmvc-interceptor.xml文件如下当你自己继承FormTokenInterceptor类实现了具体的拦截规则时就不能在相关的web工程中的springmvc配置文件中引入springmvc-interceptor.xml文件了需要添加如下配置然后在接口的方法上加上注解即可。在需要生成token的controller上增加FormToken(savetrue)而在需要检查重复提交的controller上添加FormToken(removetrue)就可以了。另外你需要在view里在form里增加下面代码注意在ajax提交时 要加上 formToken参数6、附上pom.xml依赖配置UTF-8javax.servletjavax.servlet-api3.0.1cglibcglib3.2.6com.alibabafastjson1.2.47org.springframeworkspring-expression${spring.version}org.springframeworkspring-messaging${spring.version}org.springframeworkspring-jms${spring.version}org.springframeworkspring-aop${spring.version}org.springframeworkspring-jdbc${spring.version}org.springframeworkspring-context${spring.version}org.springframeworkspring-context-support${spring.version}org.springframeworkspring-web${spring.version}org.aspectjaspectjtools1.9.1org.springframeworkspring-webmvc${spring.version}