Browse Source

从body里获取用户信息

lixing 3 years ago
parent
commit
407d9a673e

+ 31 - 0
apm-common/src/main/java/com/persagy/apm/common/handler/PoemsContextFilter.java

@@ -0,0 +1,31 @@
+package com.persagy.apm.common.handler;
+
+import com.persagy.apm.common.context.poems.PoemsContext;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @description:
+ * @author: lixing
+ * @company: Persagy Technology Co.,Ltd
+ * @since: 2021/3/8 9:35 上午
+ * @version: V1.0
+ */
+public class PoemsContextFilter extends OncePerRequestFilter {
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+        if (request instanceof HttpServletRequest) {
+            request = new PoemsRequestBodyWrapper(request);
+        }
+        filterChain.doFilter(request, response);
+    }
+}

+ 0 - 12
apm-common/src/main/java/com/persagy/apm/common/handler/PoemsContextHandler.java

@@ -35,18 +35,6 @@ public class PoemsContextHandler extends HandlerInterceptorAdapter {
             return true;
         }
 
-        ServletInputStream inputStream = request.getInputStream();
-        String reqBodyStr = IOUtils.toString(inputStream, "utf-8");
-        if (StringUtils.isNotBlank(reqBodyStr)) {
-            //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);
-        }
-
         return true;
     }
 

+ 87 - 0
apm-common/src/main/java/com/persagy/apm/common/handler/PoemsRequestBodyWrapper.java

@@ -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();
+            }
+        };
+    }
+
+}