|
@@ -0,0 +1,87 @@
|
|
|
+package com.persagy.apm.common.handler;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.persagy.apm.common.context.poems.PoemsContext;
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+
|
|
|
+import javax.servlet.ReadListener;
|
|
|
+import javax.servlet.ServletInputStream;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletRequestWrapper;
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 将请求体中的用户信息放入线程存储对象中
|
|
|
+ */
|
|
|
+public class PoemsRequestBodyWrapper extends HttpServletRequestWrapper {
|
|
|
+
|
|
|
+ public PoemsRequestBodyWrapper(HttpServletRequest request) throws IOException {
|
|
|
+ super(request);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 注:一下两个方法一定要重写,否则数据还是空
|
|
|
+ @Override
|
|
|
+ public BufferedReader getReader() throws IOException {
|
|
|
+ return new BufferedReader(new InputStreamReader(this.getInputStream()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ServletInputStream getInputStream() throws IOException {
|
|
|
+ //非json类型,直接返回
|
|
|
+ if (super.getHeader(HttpHeaders.CONTENT_TYPE) == null ||
|
|
|
+ !super.getHeader(HttpHeaders.CONTENT_TYPE).contains(MediaType.APPLICATION_JSON_VALUE)) {
|
|
|
+ return super.getInputStream();
|
|
|
+ }
|
|
|
+ //从输入流中取出body串, 如果为空,直接返回
|
|
|
+ String reqBodyStr = IOUtils.toString(super.getInputStream(), "utf-8");
|
|
|
+ if (StringUtils.isEmpty(reqBodyStr)) {
|
|
|
+ return super.getInputStream();
|
|
|
+ }
|
|
|
+
|
|
|
+ //reqBodyStr转为Map对象
|
|
|
+ Map<String, Object> paramMap = new ObjectMapper().readValue(reqBodyStr, new TypeReference<HashMap<String, Object>>() {
|
|
|
+ });
|
|
|
+ String userId = (String) paramMap.get("userId");
|
|
|
+ String loginDevice = (String) paramMap.get("loginDevice");
|
|
|
+ String pd = (String) paramMap.get("pd");
|
|
|
+ PoemsContext.setContext(userId, loginDevice, pd);
|
|
|
+
|
|
|
+ //重新构造一个输入流对象
|
|
|
+ byte[] bytes = JSON.toJSONString(paramMap).getBytes("utf-8");
|
|
|
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
|
|
|
+
|
|
|
+ return new ServletInputStream() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isFinished() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isReady() {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setReadListener(ReadListener listener) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int read() throws IOException {
|
|
|
+ return bais.read();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+}
|