spring token 令牌 防止表单重复提交

来源:互联网 发布:车辆速度测试软件 编辑:程序博客网 时间:2024/06/05 23:46

最近项目中需要对表单重复提交作处理 这里整理记录下。


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

}

}


图:



完.....

0 0
原创粉丝点击