gateway 获取上送参数、返回参数信息

2022-07-07 10:09:35

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;}}

控制台输出
在这里插入图片描述

  • 作者:Floruit_Show
  • 原文链接:https://blog.csdn.net/qq_44272797/article/details/123282415
    更新时间:2022-07-07 10:09:35