这是一个前后端分离的项目 前端用的是Vue框架 后端用的是java 现在的场景是有A和B两端 A端向B端发送请求的时候 会在请求的末尾添加上密钥和当前的时间戳 并且该请求是一个post请求需要请求体 请求体里有具体的信息 比如手机号商户号 A端需要根据密钥和请求体里的信息在前端根据特定的规则生成一个签名发送到B端 B端在接收到请求的时候会使用filter 需要根据相同的规则验证签名是否一致 否则过滤掉该请求 请将上述场景 利用代码实现
时间: 2023-12-14 09:36:09 浏览: 32
以下是一个简单的实现示例,仅供参考:
前端代码:
```javascript
import axios from 'axios';
import md5 from 'md5';
const secretKey = 'your_secret_key'; // 密钥
function generateSignature(params) {
const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&');
const timestamp = Date.now();
const signature = md5(`${sortedParams}&${timestamp}&${secretKey}`);
return { signature, timestamp };
}
function post(url, data) {
const { signature, timestamp } = generateSignature(data);
return axios.post(url, data, {
headers: {
'X-Signature': signature,
'X-Timestamp': timestamp,
},
});
}
// 使用示例
post('/api/submit', {
mobile: '123456789',
merchantId: 'abc123',
}).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error);
});
```
后端代码:
```java
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.GenericFilterBean;
public class SignatureFilter extends GenericFilterBean {
private String secretKey = "your_secret_key"; // 密钥
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String signature = request.getHeader("X-Signature");
String timestamp = request.getHeader("X-Timestamp");
if (signature == null || timestamp == null) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
Map<String, String[]> parameterMap = request.getParameterMap();
String sortedParams = Arrays.stream(parameterMap.keySet().toArray(new String[0]))
.sorted().map(key -> key + "=" + parameterMap.get(key)[0]).collect(Collectors.joining("&"));
String expectedSignature = md5(sortedParams + "&" + timestamp + "&" + secretKey);
if (!expectedSignature.equals(signature)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
chain.doFilter(request, response);
}
private String md5(String text) {
// TODO: 计算 MD5 值
return null;
}
}
```
以上代码仅为示例,具体实现可能需要根据实际情况进行调整和优化。