- 浏览: 3430716 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://my.oschina.net/ydsakyclguozi/blog/534154
原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。
注,如果是集群的方式,则需要将token放入到缓存中即可。
注解Token代码:
拦截器TokenInterceptor代码:
然后在Spring MVC的配置文件里加入:
相关代码已经注释,相信你能看懂。
关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码:
在相关方法中加入注解
已经完成了,去试试看你的数据还能重复提交了吧。
原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。
注,如果是集群的方式,则需要将token放入到缓存中即可。
注解Token代码:
@Target(ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) public @interface Token { boolean needSaveToken () default false ; boolean needRemoveToken () default false ; }
拦截器TokenInterceptor代码:
public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Token annotation = method.getAnnotation(Token. class ); if (annotation != null ) { boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession( false ).setAttribute( "token" , UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { 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 ; } }
然后在Spring MVC的配置文件里加入:
<!-- 拦截器配置 --> < mvc:interceptors > <!-- 配置Shiro拦截器,实现注册用户的注入 --> < mvc:interceptor > < mvc:mapping path = "/**" /> < bean class = "com.storezhang.video.shiro.ShiroInterceptor" /> </ mvc:interceptor > <!-- 配置Token拦截器,防止用户重复提交数据 --> < mvc:interceptor > < mvc:mapping path = "/**" /> < bean class = "com.storezhang.web.spring.TokenInterceptor" /> </ mvc:interceptor > </ mvc:interceptors >
相关代码已经注释,相信你能看懂。
关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码:
< input type = "hidden" name = "token" value = "${token}" />
在相关方法中加入注解
@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 Boot 属性配置
2016-06-24 11:04 1189Spring Boot 属性配置和使用 http://blog ... -
Spring Boot 集成MyBatis
2016-06-24 10:55 2035Spring Boot 集成MyBatis http://bl ... -
Spring MVC防重复提交
2016-06-17 15:47 1652http://my.oschina.net/zyqjustin ... -
Spring容器加载完之后执行特定任务
2016-06-17 15:36 2293http://my.oschina.net/simpleton ... -
使用spring-session和shiro来代理session的配置
2016-06-16 11:21 12067使用spring-session和redis来代理sessio ... -
JSTL 的 if else : 有 c:if 没有 else 的处理
2016-06-14 09:52 1343http://blog.csdn.net/xiyuan1999 ... -
spring mvc 请求转发和重定向
2016-06-14 09:48 1407http://blog.csdn.net/jackpk/art ... -
mvc:view-controller
2016-05-18 10:26 1089http://blog.csdn.net/lzwglory/a ... -
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4111参考: Spring AOP中pointcut express ... -
分布式任务调度组件 Uncode-Schedule
2016-05-13 14:47 2293http://www.oschina.net/p/uncode ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1632http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5531sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
Spring中使用注解 @Scheduled执行定时任务
2016-05-10 09:39 1574原文:http://dwf07223.blog.51cto.c ... -
Spring中配置Websocket
2016-05-05 16:55 1285spring+websocket整合(springMVC+sp ... -
redis 集群中Session解决方案之Spring Session
2016-05-04 08:54 1323集群中Session解决方案之Spring Session h ... -
使用Spring-data进行Redis操作
2016-05-04 08:54 4806使用Spring-data进行Redis操作 http://z ... -
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
2016-05-03 13:35 1067Spring4新特性——集成Bean Validation 1 ... -
SpringMVC介绍之Validation
2016-05-03 13:10 994SpringMVC介绍之Validation http://h ... -
spring 注解方式下使用commons-validator 验证表单
2016-05-03 11:08 3085原文: http://www.programgo.com/ar ... -
Spring MVC学习详解
2016-04-28 09:13 1010原文 http://blog.csdn.net/alsocod ...
相关推荐
在实际开发中,我们还会用到Spring的其他功能,比如Spring MVC的拦截器(Interceptor)用于全局处理,`@ExceptionHandler`注解处理异常,以及Spring的单元测试支持。同时,我们还会关注性能优化,如缓存机制(如使用...
综上所述,"spring mvc+mybatis+oracle+jquery easy ui实现增删改查,带拦截器"的项目结合了现代Web开发中的多个核心技术,构建了一个完整的业务处理流程,从用户界面交互到数据库操作,再到安全控制,实现了高效且...
1. **web.xml**:配置DispatcherServlet,包括初始化参数、拦截器、监听器等。 2. **spring-mvc.xml**:定义Bean、数据源、事务管理器、视图解析器、HandlerMapping和HandlerAdapter等。 四、Spring MVC 原理 1. *...
Spring 注解方式防止重复提交原理是通过使用注解和拦截器来实现防止重复提交的。该方法可以防止用户重复提交表单,以提高系统的安全性和可靠性。 2. 使用 Token 防止重复提交 使用 Token 防止重复提交是一种常用...
Spring MVC还支持数据绑定、表单验证、本地化和拦截器等特性,增强了应用的可扩展性和易用性。 **MyBatis** MyBatis是一个优秀的持久层框架,它简化了Java与数据库之间的交互,避免了传统的JDBC代码的繁琐。MyBatis...
- 配置Spring MVC和Spring,设置拦截器、过滤器等。 - 进行单元测试和集成测试,确保功能正常。 这个项目涵盖了Java Web开发中的许多重要概念和技术,对于理解MVC架构、ORM框架以及电子商务系统的设计和实现具有...
在Spring MVC框架中,拦截器(HandlerInterceptor)是一种强大的机制,用于在请求处理前后执行自定义逻辑。它们在控制器方法执行之前和之后运行,提供了一种灵活的方式来添加全局行为,如认证、授权、日志记录、性能...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分...
此外,Spring MVC 还支持拦截器(Interceptor),它们可以全局地处理请求和响应,如记录日志、权限检查等。`@ModelAttribute` 注解可以用于将数据从模型绑定到视图,或者从请求参数中提取数据到方法参数。 最后,...
4. 实现Spring MVC的拦截器,进行权限控制和日志记录。 5. 集成Spring Data JPA或MyBatis的Mapper,实现更高级的数据访问功能。 6. 整合Spring Security或Shiro进行安全控制,保护敏感资源。 7. 使用Spring MVC的...
3. **Spring的拦截器(Interceptor)**:可以自定义拦截器,实现`HandlerInterceptor`接口,其中的`postHandle()`方法可以用来处理表单提交后的状态,防止重复提交。 4. **令牌(Token)机制**:与Servlet中的令牌...
在Struts2中,Action类是业务逻辑的载体,配置在struts.xml文件中,通过拦截器链来处理请求和响应。Struts2还提供了丰富的结果类型,如dispatcher(转发)和stream(流式下载),以及强大的OGNL表达式语言,用于在...
Spring Boot整合了Spring MVC,因此我们可以利用Spring MVC的拦截器来实现各种功能,如权限验证、日志记录、性能监控等。本文将详细介绍如何在Spring Boot中设置拦截器,并通过四个基本的HTTP请求方法(PUT、DELETE...
表单提交的数据可以直接绑定到控制器方法的参数上,通过@ModelAttribute注解实现。Hibernate Validator或JSR-303/JSR-349规范的验证可以集成到模型属性的验证中,确保输入数据的有效性。 拦截器(Interceptor)是...
2. **配置Spring MVC**: 配置DispatcherServlet,设置拦截器、视图解析器等。 3. **配置MyBatis**: 编写Mapper XML文件,定义SQL语句,并在Mapper接口上使用注解或XML进行绑定。 4. **创建Mapper接口**: 在Spring ...
为了实现这些功能,Spring MVC的配置文件(如servlet-context.xml)需要正确配置组件扫描、视图解析器、拦截器等。不过,现代Spring MVC项目往往倾向于使用Java配置或Spring Boot的自动配置,减少了XML的使用。 在...
5. **配置SpringMVC**:创建SpringMVC的配置文件,如 servlet-context.xml,配置DispatcherServlet、视图解析器、拦截器等。 6. **配置MyBatis**:创建MyBatis的全局配置文件mybatis-config.xml,以及Mapper接口和...
- **允许其他MVC实现**:Spring MVC 支持多种不同的 MVC 实现,这为开发者提供了更多的选择性。 - **DispatcherServlet**:这是 Spring MVC 的前端控制器,负责接收 HTTP 请求并分发给合适的后端组件处理。 - **...
《网上书城 Spring-MVC》项目是基于Spring-MVC框架构建的一个典型电子商务平台,它展示了如何使用Spring-MVC来实现高效、灵活的Web应用程序开发。Spring-MVC是Spring框架的一部分,专门用于处理Web层的业务,提供了...