使用Token(令牌机制)解决重提交的问题

1.

第一步:创建一个注解判断请求方法是否支持防重提交

注意:注解的作用就是用于标识方法是否需要防重提交!!!

(1)获得Token

(2)删除Token

package cn.lxm.edu.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

 * 声明一个防重提的注解

 * @author ranger

 *

 */

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface TokenForm {

/**

 * 用于标识创建token

 * @return

 */

boolean create() default false;

/**

 * 用于标识删除token

 * @return

 */

boolean remove() default false;

}

第二步:编写一个拦截器,处理什么是否创建Token,什么时候删除Token,什么时候跳回指定页面

/**

 *  防重提交拦截器的实现

 * @author ranger

 *

 */

public class TokenFormInterceptor implements HandlerInterceptor {

private static final Logger logger =LogManager.getLogger(TokenFormInterceptor.class);

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

HttpSession session = request.getSession();

//表单传递过来的Token

String requestToken = request.getParameter("token");

String invoke = request.getParameter("token.invoke");

//1.获得调用方法的注解

HandlerMethod handlerMethod=(HandlerMethod)handler;

//2.获得调用方法的动态方法类对象

Method method = handlerMethod.getMethod();

TokenForm tokenForm = method.getDeclaredAnnotation(TokenForm.class);

if(tokenForm!=null) {

//判断如果是一个创建Token的方法,创建一个Token方法session里面

if (tokenForm.create()==true) {

//创建一个UUID,随机的唯一字符串

String token = UUID.randomUUID().toString();

session.setAttribute("token",token);

logger.debug("创建令牌:"+token);

//允许访问

return true;

}

if (tokenForm.remove()==true) {

String sessionToken = (String) session.getAttribute("token");

//判断是否相同

if(requestToken.equals(sessionToken)) {

session.removeAttribute("token");

//允许访问

return true;

}

}

//跳转到页面指定的路径

response.sendRedirect(request.getContextPath()+invoke);

return false;

}else {

//如果不需要防重提的请求,直接跳过

return true;

}

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

}

}

--配置拦截器的代码

 

第三步:页面需要指定两个参数支持防重提交

 

猜你喜欢

转载自www.cnblogs.com/bky-lxm/p/10846911.html