1. 程式人生 > >spring token 令牌 防止表單重複提交

spring token 令牌 防止表單重複提交

最近專案中需要對錶單重複提交作處理 這裡整理記錄下。

spring  攔截器配置程式碼:

<mvc:interceptor>
<!-- 防止表單重複提交 token令牌 攔截器 -->
<mvc:mapping path="/**" />
 <bean class="com.ptpl.core.interceptor.TokenInterceptor" />
</mvc:interceptor>

圖:


攔截器類程式碼:

package com.ptpl.core.interceptor;


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 org.springframework.web.util.WebUtils;


import com.ptpl.core.annotation.Token;


 
 
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){
WebUtils.setSessionAttribute(request, "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) WebUtils.getSessionAttribute(request, "token");
if(serverToken == null){
return true;
}

String clientToken = request.getParameter("token");
if(clientToken == null){
return true;
}

if(!serverToken.equals(clientToken)){
return true;
}
return false;
 }
}

圖:


token 自定義註解類程式碼:

package com.ptpl.core.annotation;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 
* @ClassName: Token 
* @Description: TODO(token 令牌註解) 
* @author cjm 
* @date 2017年6月14日 下午7:43:03 
*
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {


boolean save() default false;

boolean remove() default false;
}

圖:


jsp 程式碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://localhost:8080/ptpjx/test/token.action" method="get">
<input type="text" name="token" value="<%=request.getSession().getAttribute("token") %>" style="width:400px;"/>
<input type="submit" value="提交">
</form>
</body>
</html>

圖:


測試controller 程式碼;

package com.ptpl.controller;


import java.io.File;
import java.io.IOException;
import java.util.Iterator;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;


import com.ptpl.core.annotation.Token;
   

/**
  * 
 * @ClassName: TestController 
 * @Description: TODO(測試類) 
 * @author cjm 
 * @date 2017年3月14日 上午9:55:30 
 *
  */


@RequestMapping("/test")
 @Controller
public class TestController extends BaseController{
 
@RequestMapping(value = "/testtoken",method = {RequestMethod.GET,RequestMethod.POST})
@Token(save = true)
public void testtoken(HttpServletRequest request ,HttpServletResponse response){
try {
request.getRequestDispatcher("/test.jsp").forward(request, response);
} catch (ServletException e) {
 e.printStackTrace();
} catch (IOException e) {
 e.printStackTrace();
}
 }

@RequestMapping(value = "/token",method = {RequestMethod.GET,RequestMethod.POST})
@Token(remove = true)
public void test3423(HttpServletRequest request ,HttpServletResponse response){
System.out.println("=============進來了====================");
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
 e.printStackTrace();
}
 System.out.println("=============進來了dfdend====================");

}

}

圖:


完.....