Bladeren bron

增加参数数据输出,用于调试错误的接口

尚正平 2 jaren geleden
bovenliggende
commit
181e03eb8c

+ 26 - 0
src/main/java/com/diagbot/config/FilterRegistrationConfiguration.java

@@ -0,0 +1,26 @@
+package com.diagbot.config;
+
+import javax.servlet.Filter;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FilterRegistrationConfiguration {
+
+	@Bean
+	public FilterRegistrationBean<Filter> someFilterRegistration() {
+		FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
+		registration.setFilter(repeatableFilter());
+		registration.addUrlPatterns("/*");
+		registration.setName("repeatableFilter");
+		registration.setOrder(1);
+		return registration;
+	}
+
+	@Bean
+	public Filter repeatableFilter() {
+		return new RepeatableFilter();
+	}
+}

+ 27 - 0
src/main/java/com/diagbot/config/RepeatableFilter.java

@@ -0,0 +1,27 @@
+package com.diagbot.config;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class RepeatableFilter implements Filter {
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain)
+			throws IOException, ServletException {
+		WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest((HttpServletRequest) request);
+
+		String params = requestWrapper.getRequestParams();
+		log.info("【请求链接】:{},【请求参数】:{}", ((HttpServletRequest) request).getRequestURI(), params);
+
+		filterChain.doFilter(requestWrapper, servletResponse);
+	}
+}

+ 87 - 0
src/main/java/com/diagbot/config/WrappedHttpServletRequest.java

@@ -0,0 +1,87 @@
+package com.diagbot.config;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.apache.commons.io.IOUtils;
+
+public class WrappedHttpServletRequest extends HttpServletRequestWrapper {
+
+	private byte[] bytes;
+	private WrappedServletInputStream wrappedServletInputStream;
+
+	public WrappedHttpServletRequest(HttpServletRequest request) throws IOException {
+		super(request);
+		// 读取输入流里的请求参数,并保存到bytes里
+		bytes = IOUtils.toByteArray(request.getInputStream());
+		ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+		this.wrappedServletInputStream = new WrappedServletInputStream(byteArrayInputStream);
+
+		reWriteInputStream();
+
+	}
+
+	/**
+	 * 把参数重新写进请求里
+	 */
+	public void reWriteInputStream() {
+		wrappedServletInputStream.setStream(new ByteArrayInputStream(bytes != null ? bytes : new byte[0]));
+	}
+
+	@Override
+	public ServletInputStream getInputStream() throws IOException {
+		return wrappedServletInputStream;
+	}
+
+	@Override
+	public BufferedReader getReader() throws IOException {
+		return new BufferedReader(new InputStreamReader(wrappedServletInputStream));
+	}
+
+	/**
+	 * 获取post参数,可以自己再转为相应格式
+	 */
+	public String getRequestParams() throws IOException {
+		return new String(bytes, this.getCharacterEncoding());
+	}
+
+	private class WrappedServletInputStream extends ServletInputStream {
+
+		public void setStream(InputStream stream) {
+			this.stream = stream;
+		}
+
+		private InputStream stream;
+
+		public WrappedServletInputStream(InputStream stream) {
+			this.stream = stream;
+		}
+
+		@Override
+		public int read() throws IOException {
+			return stream.read();
+		}
+
+		@Override
+		public boolean isFinished() {
+			return true;
+		}
+
+		@Override
+		public boolean isReady() {
+			return true;
+		}
+
+		@Override
+		public void setReadListener(ReadListener readListener) {
+		}
+	}
+}

+ 4 - 1
src/main/java/com/diagbot/config/security/UrlFilterSecurityInterceptor.java

@@ -2,6 +2,8 @@ package com.diagbot.config.security;
 
 import com.alibaba.fastjson.JSONObject;
 import com.diagbot.exception.CommonException;
+
+import org.apache.commons.io.IOUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.SecurityMetadataSource;
 import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
@@ -43,7 +45,6 @@ public class UrlFilterSecurityInterceptor extends AbstractSecurityInterceptor im
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-
         FilterInvocation fi = new FilterInvocation(request, response, chain);
         try {
             invoke(fi);
@@ -67,6 +68,8 @@ public class UrlFilterSecurityInterceptor extends AbstractSecurityInterceptor im
         try {
             //执行下一个拦截器
             fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
+        }catch(Exception e) {
+        	logger.error("请求出现异常;请求的参数为"+IOUtils.toString(fi.getRequest().getInputStream(),"utf-8"),e);
         } finally {
             super.afterInvocation(token, null);
         }