ZuulFilter
获取请求参数、返回参数
BodyReaderHttpServletRequestWrapper
封装请求参数,request请求流只能读取一次,需要封装,否则用过后在controller层则无法获取到请求参数
package cn.com.yusys.yusp.config;import org.springframework.util.StreamUtils;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;publicclassBodyReaderHttpServletRequestWrapperextendsHttpServletRequestWrapper{privatebyte[] requestBody= null;//用于将流保存下来publicBodyReaderHttpServletRequestWrapper(HttpServletRequest request)throws IOException{super(request);
requestBody= StreamUtils.copyToByteArray(request.getInputStream());}@Overridepublic ServletInputStreamgetInputStream()throws IOException{final ByteArrayInputStream bais=newByteArrayInputStream(requestBody);returnnewServletInputStream(){@Overridepublicintread()throws IOException{return bais.read();}@OverridepublicbooleanisFinished(){returnfalse;}@OverridepublicbooleanisReady(){returnfalse;}@OverridepublicvoidsetReadListener(ReadListener readListener){}};}@Overridepublic BufferedReadergetReader()throws IOException{returnnewBufferedReader(newInputStreamReader(getInputStream()));}}
LoggerPreFilter
过滤请求信息
package cn.com.yusys.yusp.config;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import java.io.BufferedReader;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.Map;import java.util.Set;@ComponentpublicclassLoggerPreFilterextendsZuulFilter{private Logger logger= LoggerFactory.getLogger(LoggerPreFilter.class);@Overridepublic StringfilterType(){return"pre";}@OverridepublicintfilterOrder(){return1;}@OverridepublicbooleanshouldFilter(){returntrue;}@Overridepublic Objectrun()throws ZuulException{// 获取zuul提供的上下文对象
RequestContext context= RequestContext.getCurrentContext();// 从上下文对象中获取请求对象
HttpServletRequest request= context.getRequest();
BodyReaderHttpServletRequestWrapper requestWrapper= null;try{
requestWrapper=newBodyReaderHttpServletRequestWrapper(request);}catch(IOException e){
logger.error("LoggerPreFilter解析错误:"+ e.getMessage());return null;}
String method= requestWrapper.getMethod();
logger.info("【请求method】"+ method+"【请求url】"+ requestWrapper.getRequestURL());if("GET".equals(method)){
Map<String, String[]> parameterMap= requestWrapper.getParameterMap();
ArrayList<String> keys=newArrayList<>();
ArrayList<String> values=newArrayList<>();
Set<String> keySet= parameterMap.keySet();for(String key: keySet){
keys.add(key);
String valueTemp= Arrays.toString(parameterMap.get(key));
values.add(valueTemp.substring(1,valueTemp.length()-1));}
logger.info("【请求参数】 keys:"+ keys+" values:"+ values);}elseif("POST".equals(method)){
String paramsFromRequestBody= null;try{
paramsFromRequestBody=getParamsFromRequestBody(requestWrapper);}catch(IOException e){
logger.error("LoggerPreFilter getParamsFromRequestBody 解析错误:"+ e.getMessage());return null;}
logger.info("【请求参数】"+ paramsFromRequestBody.replaceAll(" ",""));}return null;}private StringgetParamsFromRequestBody(HttpServletRequest request)throws IOException{
BufferedReader br= null;
StringBuilder listString=newStringBuilder();try{
br= request.getReader();
String str="";while((str= br.readLine())!= null){
listString.append(str);}}catch(IOException e){
e.printStackTrace();}return listString.toString();}}
LoggerPostFilter
过滤返回参数
package cn.com.yusys.yusp.config;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.util.StreamUtils;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;@ComponentpublicclassLoggerPostFilterextendsZuulFilter{private Logger logger= LoggerFactory.getLogger(LoggerPostFilter.class);@Overridepublic StringfilterType(){return"post";}@OverridepublicintfilterOrder(){return0;}@OverridepublicbooleanshouldFilter(){returntrue;}@Overridepublic Objectrun()throws ZuulException{// 获取zuul提供的上下文对象
RequestContext context= RequestContext.getCurrentContext();
InputStream responseDataStream= context.getResponseDataStream();
String body= null;try{
body= StreamUtils.copyToString(responseDataStream, Charset.forName("UTF-8"));}catch(IOException e){return null;}if(body!= null){
logger.info("【返回参数】"+ body.replaceAll(" ","").replaceAll(System.getProperty("line.separator"),""));
context.setResponseDataStream(newByteArrayInputStream(body.getBytes()));}return null;}}
控制台输出