国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring/SpringBoot 過濾器修改、獲取http 請求request中的參數(shù) 和 response返回值,比如修改請求體和響應體的字符編碼

這篇具有很好參考價值的文章主要介紹了Spring/SpringBoot 過濾器修改、獲取http 請求request中的參數(shù) 和 response返回值,比如修改請求體和響應體的字符編碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

通過自定義filter,RequestWrapper,ResponseWrapper 處理請求和響應數(shù)據(jù),比如修改請求體和響應體的字符編碼

1.request 和 response 中的數(shù)據(jù)都是 存在流中的(緩存中)獲取一次就沒有了,需要重新寫回去。所以需要兩個包裝類分別繼承HttpServletRequestWrapper 和 HttpServletResponseWrapper 對 request和response進行包裝,從中獲取數(shù)據(jù)。

package com.hoau.monitor.servlet;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;

public class RequestWrapper extends HttpServletRequestWrapper {
    private final String body;

    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
                InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            public boolean isFinished() {
                return false;
            }

            public boolean isReady() {
                return false;
            }

            public void setReadListener(ReadListener readListener) {
            }

            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
        return this.body;
    }

}

package com.hoau.monitor.servlet;

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;

/**
 * @param
 * @author 
 * @create 2019-06-10 13:31
 * @return
 * @description :
 */
public class ResponseWrapper extends HttpServletResponseWrapper {

    private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    private HttpServletResponse response;
    private PrintWriter pwrite;

    public ResponseWrapper(HttpServletResponse response) {
        super(response);
        this.response = response;
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        // 將數(shù)據(jù)寫到 byte 中
        return new MyServletOutputStream(bytes);
    }

    /**
     * 重寫父類的 getWriter() 方法,將響應數(shù)據(jù)緩存在 PrintWriter 中
     */
    @Override
    public PrintWriter getWriter() throws IOException {
        try {
            pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return pwrite;
    }

    /**
     * 獲取緩存在 PrintWriter 中的響應數(shù)據(jù)
     *
     * @return
     */
    public byte[] getBytes() {
        if (null != pwrite) {
            pwrite.close();
            return bytes.toByteArray();
        }

        if (null != bytes) {
            try {
                bytes.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bytes.toByteArray();
    }

    class MyServletOutputStream extends ServletOutputStream {
        private ByteArrayOutputStream ostream;

        public MyServletOutputStream(ByteArrayOutputStream ostream) {
            this.ostream = ostream;
        }

        @Override
        public void write(int b) throws IOException {
            ostream.write(b); // 將數(shù)據(jù)寫到 stream 中
        }

        @Override
        public boolean isReady() {
            return false;
        }

        @Override
        public void setWriteListener(WriteListener listener) {

        }
    }

}

自定義Filter,主要重寫doFilter方法,在doFilter方法中通過包裝類RequestWrapper,ResponseWrapper可以獲取或修改請求和響應體內(nèi)容

package com.hoau.monitor.filter;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSONObject;
import com.hoau.common.exception.PSBCommonException;
import com.hoau.monitor.entity.MonitorData;
import com.hoau.monitor.facade.IhoauMonitorDataFacade;
import com.hoau.monitor.servlet.RequestWrapper;
import com.hoau.monitor.servlet.ResponseWrapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerMapping;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
@WebFilter(urlPatterns = {"/psb/*"}, filterName = "monitorDataFilter")
public class MonitorDataFilter implements Filter {


    @Reference(group = "HoauMonitorFacadeServiceImpl")
    @Qualifier("ihoauMonitorDataServiceImpl")
    IhoauMonitorDataFacade ihoauMonitorDataServiceImpl;

    Log log = LogFactory.getLog(MonitorDataFilter.class);

    private MonitorData monitorData;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //此處可設置http請求和響應的字符編碼格式
        servletRequest.setCharacterEncoding("gbk");
        servletResponse.setCharacterEncoding("gbk");
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
        ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);

        filterChain.doFilter(requestWrapper, responseWrapper);

        monitorData = new MonitorData();
        String params = null;
        String paramGet = null;
        String paramVar = null;
        String val = null;
//        String meth = httpServletRequest.getMethod();

        // 獲取參數(shù)的方式實際跟接收方式相關(@RequestBody @RequestParam @PathVariable),多種注解一塊用時參數(shù)拼接?
        // 與請求方式無直接關系(post get put delete)
        params = requestWrapper.getBody();
        paramGet = JSONObject.toJSONString(httpServletRequest.getParameterMap());
        paramVar = JSONObject.toJSONString(httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE));
        if (!"{}".equals(paramGet)&& !"null".equals(paramGet)) {
            params = params + paramGet;
        }
        if (!"{}".equals(paramVar) && !"null".equals(paramVar)) {
            params = params + paramVar;
        }
        log.info("========1.請求參數(shù):" + params);

        monitorData.setInterAddress(httpServletRequest.getRequestURL().toString());
        monitorData.setAccAccount("");
        monitorData.setAccIP(httpServletRequest.getRemoteAddr());
        monitorData.setAccParams(params);
        monitorData.setInterType("");
		
        byte[] bytes = responseWrapper.getBytes();
        val = new String(bytes, "UTF-8");
        monitorData.setRetVal(JSONObject.toJSONString(val));
        log.info("========2.返回值:" + val);
        //將數(shù)據(jù) 再寫到 response 中
        byte[] gbks = val.getBytes("gbk");//這里編碼轉(zhuǎn)換操作,這里轉(zhuǎn)換的一定要與接口響應的編碼相同
        servletResponse.setContentLength(gbks.length);//這一步一定要有,否則字節(jié)數(shù)組長度不夠會造成線程一直等待而阻塞
        servletResponse.getOutputStream().write(gbks);
        servletResponse.getOutputStream().flush();
        servletResponse.getOutputStream().close();

        try {
            ihoauMonitorDataServiceImpl.addMonitorData(monitorData);
        } catch (PSBCommonException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void destroy() {

    }
}


除了filter 也可以通過切面(配合注解)獲取和修改 ServletRequest , ServletResponse ,及請求和響應數(shù)據(jù)

package com.hoau.common.auth;

import java.lang.annotation.*;

/**
 * @author : 
 * @create : 2019-07-25 10:24
 * @description :監(jiān)控注解 應用此注解時,請求的第一個參數(shù)必須是 HttpServletRequest
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface HoauMonitorAnnotation {
}

package com.hoau.common.auth;

import com.alibaba.fastjson.JSONObject;
import com.hoau.common.entity.MonitorData;
import com.hoau.common.servlet.RequestWrapper;
import com.hoau.common.servlet.ResponseWrapper;
import com.hoau.common.util.HttpUtils;
import com.hoau.common.util.JsonUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.HandlerMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.HashMap;
import java.util.Map;

/**
 * @author : xilipeng
 * @create : 2019-07-25 10:25
 * @description :HoauMonitorAnnotation 監(jiān)控切面
 */
@Aspect
@Order(0)//監(jiān)控模塊優(yōu)先級必須高于 auth 校驗模塊,否則安全校驗不通過時會是監(jiān)控通知不執(zhí)行
@Component
public class MonitorAspect {

    @Value("${monitor.url}")
    protected String monitorUrl;

    @Pointcut("execution(public * com.hoau.*.controller.*.*(..)) && "
            + "@annotation(com.hoau.common.auth.HoauMonitorAnnotation)")
    public void monitorPointcut() {
    }

    @Around("monitorPointcut()")
    public Object monitorAdvice(ProceedingJoinPoint pjp) throws IOException {
        System.out.println("========> system into MonitorAspect ");
        Object result = null;
        Object[] args = pjp.getArgs();
//        BackObject backObject = new BackObject();
        MonitorData monitorData = new MonitorData();
        try {
            //獲取請求中的 HttpServletRequest
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest httpServletRequest = requestAttributes.getRequest();
            HttpServletResponse response = requestAttributes.getResponse();
//            PrintWriter writer = response.getWriter();
//            HttpEncodingAutoConfiguration httpEncodingAutoConfiguration;
//            ServletOutputStream outputStream = response.getOutputStream();
//            outputStream.
            ResponseWrapper responseWrapper = new ResponseWrapper(response);
            byte[] bytes =responseWrapper.getBytes();

            if (null != httpServletRequest) {
                //獲取請求參數(shù)
                RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
                String params = requestWrapper.getBody();
                String paramGet = JSONObject.toJSONString(httpServletRequest.getParameterMap());

                if (!"{}".equals(paramGet) && !"null".equals(paramGet)) {
                    params += paramGet;
                }
                //獲取接口路徑
                String uri = httpServletRequest.getRequestURI().toString();
//              String meth = httpServletRequest.getMethod();

                // 獲取參數(shù)的方式實際跟接收方式相關(@RequestBody @RequestParam @PathVariable),多種注解一塊用時參數(shù)拼接?
                // 與請求方式無直接關系(post get put delete)
                Map<String, Object> pathVariables = (HashMap<String, Object>) httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

                if (null != pathVariables && !pathVariables.isEmpty()) {

                    String paramVar = JSONObject.toJSONString(pathVariables);
                    params += paramVar;

                    for (String key : pathVariables.keySet()) {
                        String val = "/" + pathVariables.get(key).toString();
                        uri = uri.replace(val, "");
                    }
                }
                monitorData.setInterAddress(uri);
                System.out.println("========1.接口地址:" + uri);
                monitorData.setAccAccount("");
                monitorData.setAccIP(httpServletRequest.getRemoteAddr());
                //存入 ES 的時間
                OffsetDateTime offsetDateTime = Instant.now().atOffset(ZoneOffset.ofHours(8));//2019-08-22T11:49:53.054+08:00
                monitorData.setAccTime(offsetDateTime.toString());
                System.out.println("========Instant.now().atOffset(ZoneOffset.ofHours(8)):" + offsetDateTime.toString());
                monitorData.setAccParams(params);
                System.out.println("========2.請求參數(shù):" + params);
                monitorData.setInterType("");
            } else if (null != args) {//如果未獲取到 HttpServletRequest 就只保存請求參數(shù)和結(jié)果 和請求時間
                //存入 ES 的時間
                OffsetDateTime offsetDateTime = Instant.now().atOffset(ZoneOffset.ofHours(8));//2019-08-22T11:49:53.054+08:00
                monitorData.setAccTime(offsetDateTime.toString());
                monitorData.setAccParams(JsonUtils.toJson(args));
                System.out.println("========1.接口地址:請求參數(shù)中未獲取到  httpServletRequest");
                System.out.println("========2.請求參數(shù):" + JsonUtils.toJson(args));
            }

            result = pjp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
//            backObject.setBackStatusCode(RestErrorCodeConstants.STATUS_SYSTEM_ERROR);
//            backObject.setBackStatusStr(RestErrorCodeConstants.STATUS_SYSTEM_ERROR_INFO + e.getMessage());
//            result = JsonUtils.toJson(backObject);
        }

        monitorData.setRetVal(JSONObject.toJSONString(result));
        System.out.println("========3.返回值:" + JSONObject.toJSONString(result));
        try {
            HttpUtils.sendPostRequest(monitorUrl, JsonUtils.toJson(monitorData), "form");
        } catch (Exception e) {
            System.out.println("========監(jiān)控添加失敗:" + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("========> system out MonitorAspect ");
        return result;
    }
}

使用切面也需要filter文章來源地址http://www.zghlxwxcb.cn/news/detail-557755.html

package com.hoau.common.filter;

import com.hoau.common.servlet.RequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author : 
 * @create : 2019-09-01 16:23
 * @description :
 */
@Component//在 common 包中需要加上此注解,否則掃描不到
@WebFilter(urlPatterns = {"/*"}, filterName = "requestFilter")
public class RequestFilter implements Filter {
    private static Logger log = LoggerFactory.getLogger(RequestFilter.class);


    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
//        ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);

        filterChain.doFilter(requestWrapper, httpServletResponse);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }


}

到了這里,關于Spring/SpringBoot 過濾器修改、獲取http 請求request中的參數(shù) 和 response返回值,比如修改請求體和響應體的字符編碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Http請求響應 Ajax 過濾器

    Http請求響應 Ajax 過濾器

    10/10/2023 近期總結(jié): ? ? ? ? 最近學的后端部署,web服務器運行,各種請求響應,內(nèi)容很多,學的很亂,還是需要好好整理,前面JavaSE內(nèi)容還沒有完全掌握,再加上一邊刷題,感覺壓力很大哈哈。看群友們都在說找工作難,又會被打擊,不過感覺一切都以實力說話,提升自己

    2024年02月07日
    瀏覽(25)
  • http請求和響應(包含狀態(tài)碼)+過濾器

    http請求和響應(包含狀態(tài)碼)+過濾器

    目錄 一、http協(xié)議概述 二、http請求 三、http響應 ?四、過濾器 一、http協(xié)議概述 1.http: 超文本傳輸協(xié)議 ,是用于在網(wǎng)絡上傳輸數(shù)據(jù)的應用層協(xié)議。是互聯(lián)網(wǎng)上應用最為流行的一種網(wǎng)絡協(xié)議,用于定義客戶端瀏覽器和服務器之間交換數(shù)據(jù)的過程,基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),

    2024年02月06日
    瀏覽(26)
  • spring boot過濾器實現(xiàn)項目內(nèi)接口過濾

    spring boot過濾器實現(xiàn)項目內(nèi)接口過濾

    由于業(yè)務需求,存在兩套項目,一套是路由中心,一套是業(yè)務系統(tǒng). 現(xiàn)在存在問題是,路由中心集成了微信公眾號與小程序模塊功能,業(yè)務系統(tǒng)部署了多套服務. 現(xiàn)在需要通過調(diào)用路由中心將接口重新路由到指定的業(yè)務系統(tǒng)中 將小程序,公眾號用戶信息與業(yè)務系統(tǒng)做綁定 將路由中心的

    2023年04月20日
    瀏覽(24)
  • springboot使用過濾器

    過濾器是處于客戶端與服務器資源文件之間的一道過濾網(wǎng),幫助我們過濾一些不符合要求的請求。通常用作 Session校驗,判斷用戶權限。 使用過濾器很簡單,只需要實現(xiàn)Filter類,然后重寫它的3個方法即可。 init方法:程序啟動調(diào)用Filter的init()方法(永遠只調(diào)用一次);在容器中

    2024年02月15日
    瀏覽(96)
  • Springboot 過濾器

    攔截器和過濾器的區(qū)別: 過濾器(Filter) :可以拿到原始的http請求,但是拿不到你請求的控制器和請求控制器中的方法的信息。 攔截器(Interceptor):可以拿到你請求的控制器和方法,卻拿不到請求方法的參數(shù)。 切片(Aspect): 可以拿到方法的參數(shù),但是卻拿不到http請求和

    2023年04月15日
    瀏覽(27)
  • Spring Cloud Gateway 過濾器

    Spring Cloud Gateway 過濾器

    Spring Cloud Gateway 過濾器的種類有30多種。 官文文檔地址: Spring Cloud Gateway https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories Spring Cloud Gateway大體可以分為下面兩種類型的過濾器: 1、內(nèi)置的過濾器 ? ? ? ? 1.1、內(nèi)置的局部過濾器 ? ? ? ? 1.2、內(nèi)置的全

    2024年03月28日
    瀏覽(21)
  • Spring Security內(nèi)置過濾器詳解

    Spring Security內(nèi)置過濾器詳解

    相關文章: OAuth2的定義和運行流程 Spring Security OAuth實現(xiàn)Gitee快捷登錄 Spring Security OAuth實現(xiàn)GitHub快捷登錄 Spring Security的過濾器鏈機制 Spring Security OAuth Client配置加載源碼分析 根據(jù)前面的示例,我們已經(jīng)知道啟動時會加載18個過濾器,并且已經(jīng)知道了請求會匹配到DefaultSecurityF

    2024年02月05日
    瀏覽(26)
  • Spring boot 中的過濾器

    `javax.servlet.Filter`接口定義了幾個方法: 其中一些經(jīng)常在過濾器的實現(xiàn)中使用。以下是常用的幾個方法: 1. `doFilter()`: 這是過濾器的核心方法,用于實現(xiàn)過濾器的邏輯。在該方法中,您可以對請求進行預處理、修改請求參數(shù)、驗證身份、記錄日志等操作,然后通過調(diào)用`Filter

    2024年02月12日
    瀏覽(29)
  • SpringCloud GateWay通過過濾器GatewayFilter修改請求或響應內(nèi)容

    Spring Cloud Gateway在有些場景中需要獲取request body內(nèi)容進行參數(shù)校驗或參數(shù)修改,我們通過在GatewayFilter中獲取請求內(nèi)容來獲取和修改請求體,下面我們就基于ServerWebExchange來實現(xiàn): ServerWebExchange命名為服務網(wǎng)絡交換器,存放著重要的請求-響應屬性、請求實例和響應實例等等,有

    2024年02月16日
    瀏覽(21)
  • Spring Cloud Gateway 過濾器詳解

    Spring Cloud Gateway 過濾器詳解

    Spring Cloud Gateway根據(jù)作用范圍劃分為:GatewayFilter和GlobalFilter 由filter工作流程點,可以知道filter有著非常重要的作用,在“pre”類型的過濾器可以做參數(shù)校驗、權限校驗、流量監(jiān)控、日志輸出、協(xié)議轉(zhuǎn)換等,在“post”類型的過濾器中可以做響應內(nèi)容、響應頭的修改,日志的輸

    2023年04月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包