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 { } } |
--配置拦截器的代码
|
第三步:页面需要指定两个参数支持防重提交
原文地址:https://www.cnblogs.com/bky-lxm/p/10846911.html