这是一个前后端分离的项目 前端用的是Vue框架 后端用的是java 现在的场景是有A和B两端 A端向B端发送请求的时候 会在请求的末尾添加上密钥和当前的时间戳 并且需要请求体 请求体里有具体的信息 比如手机号商户号 A端需要根据密钥和请求体里的信息在前端根据特定的规则生成一个签名发送到B端 B端在接收到请求的时候会使用filter 需要根据相同的规则验证签名是否一致 否则过滤掉该请求 请将上述场景 利用代码实现
时间: 2023-12-14 16:35:49 浏览: 86
前端代码:
```
// 生成签名的函数
function generateSign(params, secretKey) {
// 将请求体对象转换为字符串
const paramString = Object.keys(params)
.sort()
.map(key => `${key}=${encodeURIComponent(params[key])}`)
.join('&')
// 拼接密钥和当前时间戳
const timestamp = Date.now()
const signString = `${paramString}${secretKey}${timestamp}`
// 计算签名值并返回
return md5(signString)
}
// 发送请求的函数
function sendRequest(params) {
const secretKey = 'your_secret_key'
const signature = generateSign(params, secretKey)
const timestamp = Date.now()
// 在请求末尾添加密钥和时间戳
const url = `${apiUrl}?${qs.stringify(params)}&signature=${signature}×tamp=${timestamp}`
// 发送请求
return axios.get(url)
}
```
后端代码:
```
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/*")
public class SignatureFilter implements Filter {
private final String secretKey = "your_secret_key";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
// 验证签名是否一致
String signString = req.getQueryString();
signString = signString.substring(0, signString.indexOf("&signature=")) + secretKey + timestamp;
String expectedSignature = DigestUtils.md5Hex(signString);
if (signature.equals(expectedSignature)) {
// 签名一致,继续处理请求
chain.doFilter(request, response);
} else {
// 签名不一致,返回错误响应
resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
resp.getWriter().write("Invalid signature");
}
}
@Override
public void destroy() {
}
}
```
阅读全文