代码实现使用令牌保证接口幂等性

package com.learn.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.learn.entity.OrderEntity;
import com.learn.mapper.OrderMapper;
import com.learn.utils.TokenUtils;

@RestController
public class OrderController {

	@Autowired
	private OrderMapper orderMapper;

	@RequestMapping("/getToken")
	public String getToken() {
		return TokenUtils.getToken();
	}

	// 验证Token
	@RequestMapping(value = "/addOrder", produces = "application/json; charset=utf-8")
	public Map addOrder(@RequestBody OrderEntity orderEntity, HttpServletRequest request) {
		Map map = new HashMap();
		// 代码步骤:
		// 1.获取令牌 存放在请求头中
		String token = request.getHeader("token");
		String msg = null;
		if (StringUtils.isEmpty(token)) {
			msg = "参数错误!";
			map.put("msg", msg);
			return map;
		}
		// 2.判断令牌是否在缓存中有对应的令牌
		// 3.如何缓存没有该令牌的话,直接报错(请勿重复提交)
		// 4.如何缓存有该令牌的话,直接执行该业务逻辑
		// 5.执行完业务逻辑之后,直接删除该令牌。
		if (!TokenUtils.findToken(token)) {
			msg = "请勿重复提交!";
			map.put("msg", msg);
			return map;
		}
		int result = orderMapper.addOrder(orderEntity);
		msg = result > 0 ? "添加成功" : "添加失败" + "";
		map.put("msg", msg);
		return map;
	}

}
package com.learn.utils;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

public class TokenUtils {

	private static Map tokenMaps = new HashMap();
	// 1.什么Token(令牌) 表示是一个零时不允许有重复相同的值(临时且唯一)
	// 2.使用令牌方式防止Token重复提交。

	// 使用场景:在调用第API接口的时候,需要传递令牌,该Api接口 获取到令牌之后,执行当前业务逻辑,让后把当前的令牌删除掉。
	// 在调用第API接口的时候,需要传递令牌 建议15-2小时
	// 代码步骤:
	// 1.获取令牌
	// 2.判断令牌是否在缓存中有对应的数据
	// 3.如何缓存没有该令牌的话,直接报错(请勿重复提交)
	// 4.如何缓存有该令牌的话,直接执行该业务逻辑
	// 5.执行完业务逻辑之后,直接删除该令牌。

	// 获取令牌
	public static synchronized String getToken() {
		// 如何在分布式场景下使用分布式全局ID实现
		String token = "token" + System.currentTimeMillis();
		// hashMap好处可以附带
		tokenMaps.put(token, token);
		return token;
	}

	public static boolean findToken(String tokenKey) {
		// 判断该令牌是否在tokenMap 是否存在
		String token = (String) tokenMaps.get(tokenKey);
		if (StringUtils.isEmpty(token)) {
			return false;
		}
		// token 获取成功后 删除对应tokenMapstoken
		tokenMaps.remove(token);
		return true;
	}
}
package com.learn.entity;

public class OrderEntity {

	private int id;
	private String orderName;
	private String orderDes;

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the orderName
	 */
	public String getOrderName() {
		return orderName;
	}

	/**
	 * @param orderName
	 *            the orderName to set
	 */
	public void setOrderName(String orderName) {
		this.orderName = orderName;
	}

	/**
	 * @return the orderDes
	 */
	public String getOrderDes() {
		return orderDes;
	}

	/**
	 * @param orderDes
	 *            the orderDes to set
	 */
	public void setOrderDes(String orderDes) {
		this.orderDes = orderDes;
	}

}
package com.learn.mapper;

import org.apache.ibatis.annotations.Insert;

import com.learn.entity.OrderEntity;

public interface OrderMapper {
	@Insert("insert order_info values (null,#{orderName},#{orderDes})")
	public int addOrder(OrderEntity OrderEntity);
}

 

你可能感兴趣的:(加密与安全)