码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-10 22:04:21      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:text   author   ann   dom   否支持   declared   class   使用   void   

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 {

 

}

}

--配置拦截器的代码

 技术图片

 

 

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

 技术图片

 

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

标签:text   author   ann   dom   否支持   declared   class   使用   void   

原文地址:https://www.cnblogs.com/bky-lxm/p/10846911.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!