`
wuzijingaip
  • 浏览: 331765 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring 拦截器实自定义标签 防止重复提交

阅读更多
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>

分享到:
评论

相关推荐

    springMVC自定义防重复提交

    在Spring MVC框架中,防重复提交是一个常见的需求,特别是...这个过程涉及客户端和服务器端的交互,以及可能的拦截器、自定义标签库、AOP等技术的应用。正确实施防重复提交策略,可以显著提高系统的稳定性和用户体验。

    struts2内置拦截器简介

    此拦截器用于防止重复提交表单。它会生成一个唯一的令牌并在每次提交时验证这个令牌是否有效。 ##### 2.18 Timer 此拦截器可以记录Action执行的时间,并将时间信息输出到日志或页面上。 ##### 2.19 Validation 此...

    java拦截器

    | Token | 通过Token防止重复提交 | | Validation | 使用定义的规则验证提交的数据 | | Workflow | 调用Action的validate方法,如果验证失败则返回输入视图 | #### 四、拦截器的作用与优势 拦截器在软件开发中...

    struts-default中拦截器介绍.pdf

    21. `token` 和 `token-session` 拦截器:防止重复提交,通过检查Action中的token,确保每个请求的唯一性。 22. `validation` 拦截器:执行在`xxxAction-validation.xml`中定义的验证规则,进行数据校验。 23. `...

    利用struts的token控制重复提交

    1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml &lt;result name="success"&gt;/success.jsp &lt;result name="input"&gt;/input.jsp ``` 2. **创建...

    Struts2知识点总结

    防止表单重复提交是Web开发中的一个重要功能,为了避免重复提交造成的数据重复或错误,Struts2同样提供拦截器实现这一功能。可以配置token拦截器来为每个请求生成一个令牌(token),并将这个令牌存储在客户端。提交...

    J2EE企业级项目开发-1期 任务1-8 实训项目单(一).doc

    拦截器是Spring MVC中一个重要的组件,它允许在请求被控制器处理之前或之后执行自定义逻辑。通过配置拦截器,可以实现如登录检查、权限验证等功能。在MyEclipse中,学生需要创建自定义拦截器类,并在Spring的配置...

    Struts2 in action中文版

    15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...

    struts1的相关代码

    本篇将详细阐述Struts1中涉及的几个核心知识点:标签库、文件上传与下载以及防止重复提交。 1. **Struts1标签库** Struts1提供了一套丰富的自定义JSP标签,使得开发者能够更加方便地在视图层操作数据。例如,`...

    ssh 框架技术

    - **token防止表单重复提交拦截器**:防止用户重复提交表单。 - **自定义拦截器**:可以通过实现Interceptor接口来创建自定义拦截器。 #### 六、Hibernate基础 ##### 1. 持久化、持久层 - **持久化**:将内存中的...

    Struts2.1+Spring3.0+JPA1.0 .pdf

    根据提供的文件信息,我们可以归纳出以下关键知识点,主要聚焦于Struts2框架的...随着实践经验的积累,开发者还可以探索更多高级特性,如类型转换、文件上传下载、防止重复提交等功能,进一步提高Web应用的质量和性能。

    MyJwtWorkOne.rar

    在本项目中,自定义的拦截器会在每个请求到达控制器之前检查请求头中的JWT,确保请求的合法性。如果JWT有效,请求将继续处理;否则,会返回错误信息。 4. **资源存储与权限管理**:JWT中可以携带用户的资源权限信息...

    SSM框架面试题.pdf

    Spring MVC中的拦截器可以用来实现日志记录、性能监控等功能。 25. **Spring MVC中的Controller如何工作** - 控制器是处理用户请求的主要组件。它接收请求,调用相应的业务逻辑,并返回一个`ModelAndView`对象。 ...

    java常用框架学习笔记

    Struts2的拦截器用于在请求处理前后执行某些操作,可以自定义拦截器来扩展Struts2的功能。 ##### 9.9 文件上传 Struts2提供了文件上传的支持,可以通过`File`类型的字段来接收上传的文件。 ##### 9.10 防止表单...

    struts2 详解文档

    24. **防止重复提交**:可以使用s:token标签防止表单重复提交的问题。 25. **Struts2整合Spring和Hibernate**:Struts2与Spring的整合可以实现依赖注入,与Hibernate的整合则方便进行持久化操作。 以上就是Struts2...

    struts+spring+hibernate资料

    ### Struts + Spring + Hibernate 资料 ...- **高度可定制性**:支持自定义标签库、拦截器等,能够满足复杂的应用需求。 - **社区支持**:拥有庞大的开发者社区,丰富的文档和示例,方便解决问题。

    SpringMVC-02教案1

    常用于处理表单提交后的跳转,避免重复提交。 5. **响应JSON数据**: - **过滤静态资源**:SpringMVC的DispatcherServlet默认会拦截所有请求,包括静态资源(如图片、CSS、JavaScript)。为防止这种情况,可以在`...

    java面试题

    20. **Struts2防止重复提交**: - 使用Token拦截器或TokenSession拦截器。 - 在表单中加入Token标签,并在配置文件中配置拦截器。 以上只是部分面试题的关键知识点,每个主题都值得深入学习和理解。在实际面试中...

    投票系统基于struts2

    这涉及到用户身份验证和授权,可能使用了Spring Security或自定义的认证机制。 2. **投票创建**:管理员或特定权限的用户可以创建投票主题,设置选项和投票截止日期。这部分可能使用Struts2的表单提交和Action处理...

    struts2知识总结.txt

    - 对于高级特性,如拦截器(Interceptors)、动态方法调用(Dynamic Method Invocation)等,Struts2也提供了丰富的支持。 综上所述,Struts2是一个功能强大且高度可定制的Java Web框架,适用于构建复杂的Web应用...

Global site tag (gtag.js) - Google Analytics