瀏覽代碼

作者:张哲
时间:2022/12/13
类型:开发
描述:signature加密

ZizgZh 2 年之前
父節點
當前提交
e5aec9716f

+ 59 - 3
src/main/java/com/redxun/search/service/impl/SearchServiceImpl.java

@@ -1,13 +1,17 @@
 package com.redxun.search.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.MD5Utils;
 import com.redxun.search.service.SearchService;
 import com.redxun.search.utils.HttpRequestHelper;
+import com.redxun.search.utils.MD5;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 文件名: SearchServiceImpl
@@ -18,6 +22,7 @@ import java.util.Map;
  * 修改时间:
  * 修改内容:
  */
+@Slf4j
 @Service
 public class SearchServiceImpl implements SearchService {
 
@@ -33,7 +38,11 @@ public class SearchServiceImpl implements SearchService {
         paramMap.put("pageSize",pageSize);
         paramMap.put("range",range);
         paramMap.put("secretType",secretType);
-        headerMap.put("signature", httpServletRequest.getHeader("signature"));
+        // 对signature进行加密
+        Map<String, String> params = getParams(httpServletRequest);
+        String sign = makeSign(params, "uyjg4h61j5y3t59t");
+        // String sign = "uyjg4h61j5y3t59t";
+        headerMap.put("signature", sign);
         headerMap.put("businessKey", httpServletRequest.getHeader("businessKey"));
         JSONObject respone = HttpRequestHelper.sendRequest(headerMap,paramMap,URL+"/api-kmsearch/search/search");
         if(null != respone && 200 == respone.getIntValue("code")) {
@@ -48,4 +57,51 @@ public class SearchServiceImpl implements SearchService {
         }
         return result;
     }
+
+    /**
+     * 获取请求参数
+     * @param request
+     * @return
+     */
+    public Map<String, String> getParams(HttpServletRequest request) {// 未考虑数组排序之后逗号连接
+        Map<String, String[]> map = request.getParameterMap();
+        SortedMap<String, String> result = new TreeMap<>();
+        for (Map.Entry<String, String[]> entry : map.entrySet()) {
+            if (entry.getKey().equalsIgnoreCase("file")) {
+                continue;
+            }
+            String[] value = entry.getValue();
+            if (value != null && value.length > 0) {
+                result.put(entry.getKey(), Stream.of(value).sorted().collect(Collectors.joining(",")));
+            } else {
+                result.put(entry.getKey(), null);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 制作签名
+     * @param params
+     * @param secret
+     * @return
+     */
+    public String makeSign(Map<String, String> params, String secret) {
+        List<String> keys = new ArrayList<>(params.keySet());
+        Collections.sort(keys);
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            sb.append(key);
+            // sb.append("=");
+            sb.append(params.get(key));
+            // sb.append("&");
+        }
+        // if(sb.length()>0) {
+        // sb.deleteCharAt(sb.length()-1);
+        // }
+        sb.append(secret);
+        log.info("加密后的secret -> {}",MD5.encrypt(sb.toString()).toLowerCase());
+        return MD5.encrypt(sb.toString()).toLowerCase();
+    }
 }

+ 1 - 20
src/main/java/com/redxun/search/utils/HttpUtil.java

@@ -49,6 +49,7 @@ public final class HttpUtil {
 		try {
 			URL url = new URL(strUrl);
 			HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
+			// 携带请求头
 			httpcon.setRequestProperty("signature",(String) headerMap.get("signature"));
 			httpcon.setRequestProperty("businessKey",(String) headerMap.get("businessKey"));
 			httpcon.setDoOutput(true);
@@ -79,24 +80,4 @@ public final class HttpUtil {
 			return null;
 		}
 	}
-	
-	/**
-	 * 从输入流中读取数据
-	 * 
-	 * @param inStream
-	 * @return
-	 * @throws Exception
-	 */
-	public static byte[] readInputStream(InputStream inStream) throws Exception {
-		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-		byte[] buffer = new byte[1024];
-		int len = 0;
-		while ((len = inStream.read(buffer)) != -1) {
-			outStream.write(buffer, 0, len);
-		}
-		byte[] data = outStream.toByteArray();// 网页的二进制数据
-		outStream.close();
-		inStream.close();
-		return data;
-	}
 }