java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

第一种方法:判断session中保存的token

比较麻烦,每次在提交表单时都必须传入上次的token。而且当一个页面使用ajax时,多个表单提交就会有问题。

注解Token代码:

package com.thinkgem.jeesite.common.repeat_form_validator;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 页面form token

* @author Administrator

*

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface FormToken {

boolean save() default false;

boolean remove() default false;

}

拦截器TokenInterceptor代码:

package com.thinkgem.jeesite.common.repeat_form_validator;

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 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);

}

}

private 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;

}

}

然后在Spring MVC的配置文件里加入:

相关代码已经注释,相信你能看懂。

关于这个方法的用法是:在需要生成token的controller上增加@FormToken(save=true),而在需要检查重复提交的controller上添加@FormToken(remove=true)就可以了。

另外,你需要在view里在form里增加下面代码:

已经完成了,去试试看你的数据还能重复提交了吧。

注意在ajax提交时 要加上 formToken参数

第二种方法(判断请求url和数据是否和上一次相同)

推荐,非常简单,页面不需要任何传入,只需要在验证的controller方法上写上自定义注解即可

写好自定义注解

package com.thinkgem.jeesite.common.repeat_form_validator;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 一个用户 相同url 同时提交 相同数据 验证

* @author Administrator

*

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface SameUrlData {

}

写好拦截器

package com.thinkgem.jeesite.common.repeat_form_validator;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Map;

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.thinkgem.jeesite.common.mapper.JsonMapper;

/**

* 一个用户 相同url 同时提交 相同数据 验证

* 主要通过 session中保存到的url 和 请求参数。如果和上次相同,则是重复提交表单

* @author Administrator

*

*/

public class SameUrlDataInterceptor 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();

SameUrlData annotation = method.getAnnotation(SameUrlData.class);

if (annotation != null) {

if(repeatDataValidator(request))//如果重复相同数据

return false;

else

return true;

}

return true;

} else {

return super.preHandle(request, response, handler);

}

}

/**

* 验证同一个url数据是否相同提交 ,相同返回true

* @param httpServletRequest

* @return

*/

public boolean repeatDataValidator(HttpServletRequest httpServletRequest)

{

String params=JsonMapper.toJsonString(httpServletRequest.getParameterMap());

String url=httpServletRequest.getRequestURI();

Map map=new HashMap();

map.put(url, params);

String nowUrlParams=map.toString();//

Object preUrlParams=httpServletRequest.getSession().getAttribute("repeatData");

if(preUrlParams==null)//如果上一个数据为null,表示还没有访问页面

{

httpServletRequest.getSession().setAttribute("repeatData", nowUrlParams);

return false;

}

else//否则,已经访问过页面

{

if(preUrlParams.toString().equals(nowUrlParams))//如果上次url+数据和本次url+数据相同,则表示城府添加数据

{

return true;

}

else//如果上次 url+数据 和本次url加数据不同,则不是重复提交

{

httpServletRequest.getSession().setAttribute("repeatData", nowUrlParams);

return false;

}

}

}

}

配置spring mvc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3415 最小和

3415 最小和 链接:http://codevs.cn/problem/3415/ CodeVS原创 时间限制: 1 s空间限制: 64000 KB题目描述 Description小浣熊松松来到文具店,选择了K支自己喜欢的水彩笔,并抄下了它们的价格。可是到结算时,他发现自己抄价格时抄…

java监控rabbitMq服务状态,SpringCloud-Turbine【RabbitMQ服务监控】

前面我们介绍了通过turbine直接聚合多个服务的监控信息,实现了服务的监控,但是这种方式有个不太好的地方就是turbine和服务的耦合性太强了,针对这个问题,我们可以将服务的监控消息发送到RabbitMQ中,然后turbine中Rabbi…

SVN提示被锁定的解决方法(转)

1、(常用)出现这个问题后使用“清理”即"Clean up"功能,如果还不行,就直接到上一级目录,再执行“清理”,然后再“更新”。 2、(没试过)有时候如果看到某个包里面的文件夹没…

jpa 查询 列表_终极JPA查询和技巧列表–第1部分

jpa 查询 列表我们可以在Internet上找到一些JPA“如何做”,在本博客的此处,教您如何使用JPA执行多项任务。 通常,我看到有人问有关使用JPA进行查询的问题。 通常,为了回答此类问题,提供了几个链接以尝试找到该问题的解…

windows下php swoole扩展,Windows 下安装 swoole 图文教程(php)

Windows 下安装 swoole 具体步骤:Swoole,原本不支持在Windows下安装的,所以我们要安装Cygwin来使用。在安装Cygwin下遇到了很多坑,百度经验上的文档不是很全,所以我把自己安装Cygwin和Swoole写下来相当于对自己的沉淀吧。首先准备…

软件工程实践2017第一次作业

(1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 高考之后,综合分数、地理位置、专业考虑,搭上了福州大学这趟动车,不过选报的专业给我打了个折,意外的在生…

将JQGrid与Spring MVC和Gson集成

我在一个单页面应用程序上工作,我想在使用Spring MVC的应用程序的一部分中使用网格功能。 自从我上次使用JQGrid以来已经有一段时间了,找到让我起床所需的信息有点困难。 在这篇文章中,我想整理所有信息并将其放入教程中以供遵循,…

php文件写入加1,PHP关于文件与目录(1) 写入文件 文件权限 三、锁定文件

一、文件权限总之一切都是为了保证目录的安全,保证目录的安全比保证文件的安全更重要。二、写入文件file_put_contents($file,$data); //如果没有的话会创建,有的话覆盖原文件;file_put_contents($file,$data,FILE_APPEND); //没的话会创建&a…

DB2 SQL性能调优秘笈pdf

下载地址:网盘下载 简介编辑《DB2 SQL性能调优秘笈》是一本不可多得的DB2数据库性能调优秘笈,由拥有20余年DB2工作经验的资深数据库专家撰写,Amazon全五星评价畅销书。《DB2 SQL性能调优秘笈》不仅详尽阐述了100余条SQL语句优化的技巧和最佳实…

matlab点到曲线的距离视频,使用MATLAB计算点到直线距离

给定平面上 x1, x2, x3三个点,求x1到x2、x3之间的直线的距离。我是用的是内积的方法求解,依据原理是使用内积求出直线x2x1 与 直线x3x1的夹角cos值,进而求出sin值,再求出x1到x2x3的距离。这种方法的不足之处是,当三点之…

新CalendarFX视图:MonthGridView!

我和我的团队最近开始为CalendarFX创建新视图,其最初目标是在垂直列中显示整年。 该视图的名称是MonthGridView。 像往常一样,编码时目标略有变化。 该视图现在可以显示任意数量的月份,并且可以在前面或后面添加额外的月份。 现在&#xff0c…

php如何和c进行数据交换,PHP与 后台c交换数据 | 学步园

为什么要用json跟XML相比,JSON的优势在于格式简洁短小,特别是在处理大量复杂数据的时候,这个优势便显得非常突出。从各浏览器的支持来看,JSON解决了因不同浏览器对XML DOM解析方式不同而引起的问题。目前,JSON已经成为…

1 课外笔记之网页动画——jsp系列问题

1.直接用记事本进行网页的编写&#xff0c;代码中还有中文&#xff0c;用网页打开后&#xff0c;会导致中文部分出现乱码问题。 解决办法&#xff1a; 1.保存为utf-8编码&#xff0c;保存为gbk编码 2.添加一行代码&#xff1a;<meta http-equiv"Content-Type" con…

php while结束循环吗,php while循环退不出是什么有关问题

php while循环退不出是什么问题&#xff1f;include(include/config.php);include(include/dbclass.php);session_start();$db db::getInstance();// $db->check_user_login(); //检查用户是否登录$db->createcon(); //建立连接// $user$_SESSION["u…

8月31日笔记

1、http返回码200、302、304、404、500的含义 2、mybatis中插入记录时获取主键 3、sql&#xff0c;如何查询两个包含两个不同列的结果 4、sql&#xff0c;如何把邮箱中的139.com替换为qq.com 5、sql&#xff0c;如何获取姓名中的姓&#xff0c;并且统计每一个姓的数量 6、还有四…

硒测试的干净架构

在这篇博客文章中&#xff0c;我想介绍一种具有最佳设计模式的Selenium测试的简洁架构&#xff1a;页面对象&#xff0c;页面元素&#xff08;通常称为HTML包装器&#xff09;和自行开发的非常小巧的框架。 该体系结构不限于示例中使用的Java&#xff0c;也可以以任何其他语言应…

ThinkPHP5 封装邮件发送服务(可发附件)

1、Composer 安装 phpmailer 1composer require phpmailer/phpmailer2、ThinkPHP 中封装邮件服务类 我把它封装在扩展目录 extend/Mail.php 文件里&#xff0c;内容如下&#xff1a; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748…

php中如何定义常量和变量的区别,php define常量定义与变量区别

常量在使用前必须要定义&#xff0c;否则程序执行会出错。在php中使用define()函数来定义常量。1、语法格式&#xff1a;define("常量名称","常量的值");例如&#xff1a;define("php360","完美的php");下面还是来一个范例吧&#xff…

PHP小语种网站开发,当阳小语种建站

当阳小语种建站&#xff0c;六脉(LIUMAI)&#xff0c;专注于帮助中小企业开拓海外市场获取外贸订单&#xff0c;提供外贸整体解决方案。当阳小语种建站&#xff0c; 拥有强大的搜索引擎优化功能&#xff0c;通过操作全球贸易通后台可以轻松实现对英语及小语种网站的搜索优化&am…

密码学笔记——eval(function(p,a,c,k,e,d) 加密破解

密码学笔记——eval(function(p,a,c,k,e,d) 的加密破解 例题&#xff1a; 小明某天在看js的时候&#xff0c;突然看到了这么一段代码&#xff0c;发现怎么也理不出代码逻辑&#xff0c;你能帮帮他吗&#xff1f; 格式&#xff1a;SimCTF{} eval(function(p,a,c,k,e,d){efunctio…