package test.demo.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 create() default false ;
boolean validate() default false ;
boolean reply() default false ;
}
package test.demo.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;
import com.util.MethodUtil;
//拦截器类
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) {
if (annotation.create()) {
request.getSession(false).setAttribute("token", UUID.randomUUID().toString() );
}
if (annotation.validate()) {
if (isRepeatSubmit(request)) {
if(annotation.reply()) writeMessageUtf8(response);
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;
}
private void writeMessageUtf8(HttpServletResponse response) throws Exception {
try {
response.setCharacterEncoding("UTF-8");
response.getWriter().print(MethodUtil.toJson("REPEAT"));
} finally {
response.getWriter().close();
}
}
}
页面form里加:
<input type="hidden" name="token" value="${token}" />
@Token(create=true)//mvc里,进入页面前的方法上面加此
@Token(validate=true)//mvc里提交方法上面加此
spring 配置文件里加:
<mvc:interceptors>
<!-- 配置Token拦截器,防止用户重复提交数据 -->
<mvc:interceptor >
<mvc:mapping path = "/com/xxx/**" />
<bean class = "test.demo.token.TokenInterceptor" />
</mvc:interceptor >
</mvc:interceptors>
分享到:
相关推荐
主要介绍了spring boot 防止重复提交实现方法,结合实例形式详细分析了spring boot 防止重复提交具体配置、实现方法及操作注意事项,需要的朋友可以参考下
1.针对SpringMVC注解的配置,可起到入门的作用 2.Spring+JdbcTemplate事物管理 3.Spring+Hibernate事物管理 4.Spring实现DWR注解方式的应用配置 ...6.Spring通过拦截器实现防止重复提交实例 对学习,会起到非常好的效果
spring的自定义标签代码工程样例,Chapter2工程
springboot2.1+redis+拦截器 防止表单重复提交详细完整介绍,所用到的文件都上传了,下载即可使用。自己花了半天整理,并且测试通过,使用在实际项目中的,希望对每一个下载的朋友有帮助。
Spring MVC--自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器Spring MVC--13.自定义拦截器
CXF3.0 Spring3.2 自定义拦截器
spring拦截器,高级参数绑定,controller返回值
Spring Boot+Redis+拦截器+自定义Annotation如何实现接口自动幂等.docx
spring mvc freemarker 自定义标签demo spring mvc 通过自定义的标签在jsp页面调用,初学,记录下做个备忘
网上很多人想使用注解拦截spring mvc action中的一个方法,实现方法很多,一般是通过在拦截器中分析url路径来实现, 使用自定义注解的方式来标注要拦截的 action 中的某个方法, 没有很好的解决方法, 如果通过借助spring...
AOP拦截器示例,告诉我们初学者理解aop,通过一个银行转帐说明问题。
Spring 防止重复提交,可以参考文档内容配置和编写,相关代码。
Spring AOP 拦截器 Advisor Spring AOP 拦截器 Advisor
NULL 博文链接:https://lpm528.iteye.com/blog/1259187
自己spring boot 拦截器,可以自定义限制跳转路径及自定义不拦截哪些具体路径,具体设置可以看注释,一看就懂,引用哪些包已经包含了,不明白的请浏览,看到后第一时间给您回复
spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo,这个是含拦截器
Spring MVC 拦截器Spring MVC 拦截器
spring-boot 拦截器 登录拦截spring-boot 拦截器 登录拦截spring-boot 拦截器 登录拦截spring-boot 拦截器 登录拦截
NULL 博文链接:https://rogerhunt.iteye.com/blog/608778
idea软件。SpringBoot的拦截器的博客所写的例子。preHandle()方法的返回值true和false的详细区别还未描述