使用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 {

}

}

--配置拦截器的代码


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

 

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

时间: 2024-10-15 02:14:50

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

struts token令牌机制

利用Struts同步令牌(Token)机制来解决Web应用中的重复提交问题.该方法的基本原理是:服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session中的令牌值进行比较,看是否匹配.在处理完该request后,且在response发送给客户端之前,将会产生一个新的 Token,该Token除传给客户端以外,也会将用户session中保存的旧的Token进行替换.这样,如果用户会退到刚才的提交页面并再次提交的话,客户端传过来的Token值和服务器端

.NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢迎各种吐槽批判践踏... 先说说用户身份的识别,简单的做了一个token机制.用户登录,后台产生令牌,发放令牌,用户携带令牌访问... 1.cache管理类,由于博主使用的HttpRuntime.Cache来存储token,IIS重启或者意外关闭等情况会造成cache清空,只好在数据库做了cache

WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

.NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制 项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢迎各种吐槽批判践踏... 先说说用户身份的识别,简单的做了一个token机制.用户登录,后台产生令牌,发放令牌,用户携带令牌访问... 1.cache管理类,由于博主使用的HttpR

atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭

atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() throw OvertimeEX retry(5times):: throw OvertimeEX 调用器() /// 调用原来的api 测试器() :::://////返回T/f Reset()     //// 重设器 End:: 测试器() 命令Case1 ok, 返回T Case2 fail,

php通过token验证表单重复提交

PHP防止重复提交表单 2016-11-08 轻松学PHP 我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手,首先从前端做限制.前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效.第二,

解决git提交敏感信息(回退git版本库到某一个commit)

解决git提交敏感信息(回退git版本库到某一个commit) Fri 07 June 2013 git是一个很好的版本库, 现在很多人用它, 并在github上创建项目, 相信大家都有过将敏感信息提交版本的经历, 如何删除? 好像只有删除版本库来解决, 其实我们可以通过回退版本库删除相应的commit来将提交的敏感信息去掉. 备份本地代码 首先我们将本地代码的更改备份一下, 以防丢失更改 回退本地代码的commit 备份完数据, 我们就可以先回退本地的版本库 git reset --hard

PHP Token(令牌)设计应用

PHP Token(令牌)设计 设计目标: 避免重复提交数据. 检查来路,是否是外部提交 匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作) 这里所说的token是在页面显示的时候,写到FORM的一个隐藏表单项(type=hidden). token不可明文,如果是明文,那就太危险了,所以要采用一定的加密方式.密文要可逆.俺算法很白痴,所以采用了网上一个现成的方法. 如何达到目的: 怎样避免重复提交? 在SESSION里要存一个数组,这个数组存放以经

token防止表单重复提交

出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; import java.io.IOException; import java.io.PrintWriter; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServle

drf框架 8 系统权限类使用 用户中心信息自查 token刷新机制 认证组件项目使用:多方式登录 权限组件项目使用:vip用户权限 频率组件 异常组件项目使用

系统权限类使用 图书接口:游客只读,用户可增删改查权限使用 from rest_framework.permissions import IsAuthenticatedOrReadOnly class BookViewSet(ModelViewSet): # 游客只读,用户可增删改查 permission_classes = [IsAuthenticatedOrReadOnly] queryset = models.Book.objects.all() serializer_class = se