JAVA获取请求头header中的参数

    //获得当前HttpServletRequest对象
    protected HttpServletRequest getRequest(){
        return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
    }

    //获取heard中的参数
    protected Map<String, String> getRequestHeaderMap() {
        HttpServletRequest request = getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        Map<String, String> headerMap = new HashMap<>(8);
        while (headerNames.hasMoreElements()) {
            String name = headerNames.nextElement();
            headerMap.put(name, request.getHeader(name));
        }
        return headerMap;
    }

获取请求头中的某个参数,注:获取时,get中需写全小写的参数名称

    String xxx= getRequestHeaderMap.get("xxx");
Java中,验证HTTP请求头和请求参数的签名通常涉及到安全通信,比如使用HTTPS协议并检查API密钥、加密哈希或其他认证机制。一种常见的做法是在客户端和服务端使用相同的算法对数据进行计算,然后比较生成的散列值。 例如,如果你在使用RESTful API,并且采用了HMAC-SHA256这样的签名策略,可以按照以下步骤操作: 1. **服务器端处理**: - 接收客户端发送的请求头(如`Authorization`字段)和请求参数。 - 按照约定的规则(通常是把请求方法、URL、以及请求体(如果需要)拼接成字符串)作为消息体。 - 使用服务端的私钥和指定的算法(如SHA256)计算消息体的哈希值,得到预期的签名。 2. **客户端创建请求**: - 将请求方法、URL、请求参数(可能需要编码)组合成字符串。 - 使用客户端的公钥(通常由服务端提供)和同样算法计算消息体的哈希值。 - 将这个哈希值附加到请求头(例如`Authorization: HMAC-SHA256 signature=calculated_signature`)。 3. **校验**: - 服务器端收到请求后,再次计算哈希值并与请求头中的签名进行对比。 - 如果两者匹配,则认为签名有效,请求通过;如果不匹配,则可能是伪造请求或传输过程中出错。 ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public boolean verifySignature(String requestHeader, Map<String, String> queryParams) { // 获取服务器提供的公共密钥(例如从配置文件) byte[] signingKey = getSigningKey(); // 构造消息体(包含方法、URL和请求参数) String message = generateMessage(requestMethod, apiUrl, queryParams); try { // 创建HMAC-SHA256实例并初始化 Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec(signingKey, "HmacSHA256"); // 计算哈希值 byte[] calculatedSignature = mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); calculatedSignature = Base64.getEncoder().encode(calculatedSignature); // 对结果进行Base64编码 // 从请求头获取实际签名并解码 String receivedSignature = requestHeader.split(":")[1].trim(); byte[] receivedSignatureBytes = Base64.getDecoder().decode(receivedSignature); // 比较两个签名 return Arrays.equals(calculatedSignature, receivedSignatureBytes); } catch (Exception e) { throw new RuntimeException("Failed to verify signature", e); } } private String generateMessage(String method, String url, Map<String, String> queryParams) { StringBuilder sb = new StringBuilder(); sb.append(method).append("\n").append(url).append("\n"); // 添加请求方法和URL if (!queryParams.isEmpty()) { sb.append(queryParams.entrySet().stream() .map(entry -> entry.getKey() + "=" + entry.getValue()) .collect(Collectors.joining("&"))); // 添加排序后的查询参数,假设它们是以某种固定的顺序传递的 } return sb.toString(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值