springmvc防止form表單重複提交

網上例子太多,自己拿過來記錄一下

首先,定義註解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {

    boolean save() default false;

    boolean remove() default false;
}


定義Controller

@Controller
@RequestMapping("controller3")
public class Controller3 {
	
	@Token(save=true)//跳轉到錄入頁面時,生成token
	@RequestMapping("test1")
	public String test1(){
		return "save";
	}
	
	@Token(remove=true)//需要檢查token的處理器上,設置remove=true
	@RequestMapping("test2")
	public String test2(Student stu){
		System.out.println(stu);
		return null;
	}
	
}

jsp頁面:

<form action="${pageContext.request.contextPath }/controller3/test1" method="post">
<input type="hidden" name="token" value="${token}" />
<input name="name" type="text"><br>
<input name="id" type="text"><br>
<input type="submit" value="註冊">
</form>


定義攔截器:

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){
				boolean needSaveSession = annotation.save();
				if(needSaveSession){
					request.getSession().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;
	}	
}

最後需要將攔截器配置到springmvc配置文件中

	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="lee.interceptor.TokenInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章