Spring MVC拦截器+注解方式实现防止表单重复提交
1.新建注解:
/*** <p>* 防止重复提交注解,用于方法上<br/>* 在新建页面方法上,设置needSaveToken()为true,此时拦截器会在Session中保存一个token,* 同时需要在新建的页面中添加* <input type="hidden" name="token" value="${token}">* <br/>* 保存方法需要验证重复提交的,设置needRemoveToken为true* 此时会在拦截器中验证是否重复提交* </p>* @author: chuanli* @date: 2013-6-27上午11:14:02**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidDuplicateSubmission {boolean needSaveToken() default false;boolean needRemoveToken() default false;
}
2. 新建拦截器
/*** <p>* 防止重复提交过滤器* </p>** @author: chuanli* @date: 2013-6-27上午11:19:05*/
public class AvoidDuplicateSubmissionInterceptor extends HandlerInterceptorAdapter {private static final Logger LOG = Logger.getLogger(AvoidDuplicateSubmissionInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {User user = UserUtil.getUser();if (user != null) {HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();AvoidDuplicateSubmission annotation = method.getAnnotation(AvoidDuplicateSubmission.class);if (annotation != null) {boolean needSaveSession = annotation.needSaveToken();if (needSaveSession) {request.getSession(false).setAttribute("token", TokenProcessor.getInstance().generateToken());}boolean needRemoveSession = annotation.needRemoveToken();if (needRemoveSession) {if (isRepeatSubmit(request)) {LOG.warn("please don't repeat submit,[user:" + user.getUsername() + ",url:"+ request.getServletPath() + "]");return false;}request.getSession(false).removeAttribute("token");}}}return true;}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;}}
3. 在Spring中配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"><property name="interceptors"><list><bean class="com.sohu.tv.crm.aop.UserLogInterceptor"/><bean class="com.sohu.tv.crm.aop.AvoidDuplicateSubmissionInterceptor"/></list></property></bean>
4. 在相关方法中加入注解:
@RequestMapping("/save")@AvoidDuplicateSubmission(needRemoveToken = true)public synchronized ModelAndView save(ExecutionUnit unit, HttpServletRequest request, HttpServletResponse response)throws Exception {@RequestMapping("/edit")@AvoidDuplicateSubmission(needSaveToken = true)public ModelAndView edit(Integer id, HttpServletRequest request) throws Exception {
Spring MVC拦截器+注解方式实现防止表单重复提交相关推荐
- spring boot 学习(七)小工具篇:表单重复提交
注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...
- 大聪明教你学Java | Spring Boot 使用自定义注解实现防止表单重复提交
前言 表单重复提交是在多用户的 Web 应用中最常见且带来麻烦最多的一个问题.有很多的应用场景都会遇到表单重复提交问题,比如由于用户误操作,多次点击表单提交按钮:由于网速等原因造成页面卡顿,用户重复刷 ...
- Spring MVC拦截器~~~登陆验证拦截
[ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...
- 使用session监听+spring MVC拦截器禁止用户重复登录
在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...
- spring mvc拦截器_Spring MVC拦截器示例
spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Java Spring MVC框架 VIII 之 Spring MVC拦截器
Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...
- spring mvc 拦截器拦截jsp页面
spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...
- Spring Boot中防表单重复提交以及拦截器登录检测
目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...
最新文章
- python 3.7.732位安装步骤_python安装教程(Windows系统,python3.7为例)
- 阿里云直播PHP SDK如何使用
- Struts2 ognl表达式
- .NET 文档数据库 RavenDB 4.0 发布
- Mathematics(jzoj 1747)
- cacti 忘记密码的方法
- 【如意影视】运营级+完整类库+解析线路+无限增加或删减解析接口+如意可视化播放器1.1
- 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
- 发动机冒黑烟_发动机冒黑烟的原因和解决方法
- 第二章注解深入浅出(三、插桩)
- XAMP安装Apacher无法启动
- 2.GSAP(TweenMax手册/TweenLite手册)之一
- bc伐木机器人_1+X | 工业机器人操作编程平台(HB-CZBC-C10)
- 股权模板:72套股权分配方案
- 散列表,(拉链法,平方探测法,线性探测法)
- ecs共享型s6怎么样?
- 基于javaweb的宠物店管理系统(java+jsp+javascript+bootstrap+mysql)
- 人在做,天在看:天道有轮回,苍天饶过谁
- 基于JavaWeb的新闻发布管理系统设计与实现
- 看电视剧《天道》一点感想 + 法兰克福美景Opencv聚类分析
热门文章
- LESSON 11.4 原理进阶:AdaBoost算法流程详解
- 孙正义看未来30年:投资趋势,永远不会错
- ubuntu jdk
- redis 实际应用中的缓存作用
- 国家新一代人工智能开放创新平台将参加重庆智博会
- Caffe部署中的几个train-test-solver-prototxt-deploy等说明二
- 贾跃亭画了一个8500亿的大饼
- Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式
- Shell-alias在Shell脚本中的使用
- 学习笔记Kafka(二)—— Kafka安装配置(1)—— JDKZookeeper安装、Zookeeper 常用操作