1生成签名
2使用拦截器验证签名
2.1重写request,以读取存储二级制流
2.2配置过滤器,将默认的request替换为重写的
2.3配置过滤器
2.4写拦截器
2.5配置拦截器
1生成签名
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.renren.common.utils.SM3Util;
import cn.hutool.core.util.HexUtil;
import java.util.HashMap;
import java.util.Map;
public class SignUtils {
public static void main(String[] args) {
//appid对应一个accessKey,存储在数据库中
String accessKey = "71a8e08ca1122c61faff1abffcbc8226b9a2e940";
Long timestamp = System.currentTimeMillis();
Map<String, Object> map = new HashMap<String, Object>();
map.put("id","333");
map.put("id2","陈大壮");
map.put("passwd","XFCY8R7dhRRnyXDMAlzTNvDKnf9zT2RO1bVc8LXe0K6Qj6vifnWawy5JJw6vhl8xuokTQPqTtoK8gpKfslS08emERiejbZrhrYfmyeof7EPpv+VCwLQ/vbbi4hwwUtK+9s8M6MuOXVAisd06WXq5BdT4RDMDvd48pptB+tXJsd8=");
ObjectMapper objectMapper = new ObjectMapper();
String hexStr = "";
try {
String valueAsString = objectMapper.writeValueAsString(map);
System.out.println(valueAsString);
String verifySing = accessKey + "&" + timestamp + "&" + valueAsString;
System.out.println(verifySing);
byte[] hmac = SM3Util.hash(verifySing.getBytes());
hexStr = HexUtil.encodeHexStr(hmac);
System.out.println(hexStr);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
生成json串类似下图。
{
"timeStamp":"1650606559147",
"sign":"3cb7c8b5715e510de106b76c40e1397a5d5c73c70d53994f3eca3b72c84a8264",
"appId":"fxIzd7xG",
"data":{
"id2":"陈大壮",
"id":"333",
"passwd":"XFCY8R7dhRRnyXDMAlzTNvDKnf9zT2RO1bVc8LXe0K6Qj6vifnWawy5JJw6vhl8xuokTQPqTtoK8gpKfslS08emERiejbZrhrYfmyeof7EPpv+VCwLQ/vbbi4hwwUtK+9s8M6MuOXVAisd06WXq5BdT4RDMDvd48pptB+tXJsd8="
}
}
2 使用拦截器验证签名
2.1重写request,以读取存储二级制流
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
/**
* 解决request流只读取一次的问题
*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
/**
* 存储body数据的容器
*/
private final byte[] body;
public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
// 将body数据存储起来
body = getBodyString(request).getBytes(Charset.defaultCharset());
}
/**
* 获取请求Body
*
* @param request request
* @return String
*/
public String getBodyString(final ServletRequest request) {
try {
return inputStream2String(request