• springboot 通过filter修改请求体和响应体


    1.新建ModifyRequestBodyWrapper.class

    package com.example.my_project.filter;

    import org.apache.commons.io.IOUtils;

    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;

    /**
    * 自定义HttpServletRequestWrapper 用于修改请求体
    */
    public class ModifyRequestBodyWrapper extends HttpServletRequestWrapper {

    private String oldRequestBody;

    private String newRequestBody;

    public ModifyRequestBodyWrapper(HttpServletRequest request) throws IOException {
    super(request);
    this.oldRequestBody = IOUtils.toString(request.getInputStream(),request.getCharacterEncoding());
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
    return new ServletInputStream() {
    final ByteArrayInputStream bis = new ByteArrayInputStream(newRequestBody.getBytes(StandardCharsets.UTF_8));
    @Override
    public boolean isFinished() {
    return true;
    }

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

    @Override
    public void setReadListener(ReadListener readListener) {

    }

    @Override
    public int read() throws IOException {
    return bis.read();
    }
    };
    }

    public String getOldRequestBody() {
    return oldRequestBody;
    }

    public void setOldRequestBody(String oldRequestBody) {
    this.oldRequestBody = oldRequestBody;
    }

    public String getNewRequestBody() {
    return newRequestBody;
    }

    public void setNewRequestBody(String newRequestBody) {
    this.newRequestBody = newRequestBody;
    }
    }

    2.新建ModifyResponseBodyWrapper.class

    package com.example.my_project.filter;

    import javax.servlet.ServletOutputStream;
    import javax.servlet.WriteListener;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;

    /**
    * 自定义HttpServletResponseWrapper 修改响应体
    */
    public class ModifyResponseBodyWrapper extends HttpServletResponseWrapper {


    private ByteArrayOutputStream bos;

    public ModifyResponseBodyWrapper(HttpServletResponse response) {
    super(response);
    this.bos = new ByteArrayOutputStream();
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
    return new ServletOutputStream() {
    @Override
    public boolean isReady() {
    return true;
    }

    @Override
    public void setWriteListener(WriteListener writeListener) {

    }

    @Override
    public void write(int b) throws IOException {
    bos.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
    bos.write(b);
    }
    };
    }

    @Override
    public PrintWriter getWriter() throws IOException {
    return new PrintWriter(new OutputStreamWriter(bos));
    }

    public String getResponseBody() throws IOException {
    ServletOutputStream outputStream = this.getOutputStream();
    outputStream.flush();

    PrintWriter writer = this.getWriter();
    writer.flush();

    return bos.toString(this.getCharacterEncoding());
    }
    }

    3.新建HttpRequestFilter.class

    package com.example.my_project.filter;

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.filter.OncePerRequestFilter;

    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.util.Map;

    /**
    * 修改请求体响应体
    */
    @Slf4j
    public class HttpRequestFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    ModifyRequestBodyWrapper modifyRequestBodyWrapper = new ModifyRequestBodyWrapper(request);
    String oldRequestBody = modifyRequestBodyWrapper.getOldRequestBody();
    log.info("path:{}",request.getRequestURI());
    log.info("oldRequestBody:{}",oldRequestBody);
    String newRequestBody = changeRequestBody(oldRequestBody);
    log.info("newRequestBody:{}",newRequestBody);
    modifyRequestBodyWrapper.setNewRequestBody(newRequestBody);

    ModifyResponseBodyWrapper modifyResponseBodyWrapper = new ModifyResponseBodyWrapper(response);
    filterChain.doFilter(modifyRequestBodyWrapper,modifyResponseBodyWrapper);
    String oldResponseBody = modifyResponseBodyWrapper.getResponseBody();
    log.info("oldResponseBody:{}",oldResponseBody);
    String newResponseBody = changeResponseBody(oldResponseBody);
    log.info("newResponseBody:{}",newResponseBody);
    response.setContentType(request.getContentType());
    byte[] responseBodyData = newResponseBody.getBytes(StandardCharsets.UTF_8);
    ServletOutputStream out = response.getOutputStream();
    out.write(responseBodyData);
    }

    /**
    * 修改请求体
    * @param oldRequestBody 修改前的请求体
    * @return 修改后的请求体
    */
    public String changeRequestBody(String oldRequestBody) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, String> stringStringMap =objectMapper.readValue(oldRequestBody, new TypeReference<Map<String, String>>() {
    });
    stringStringMap.put("password","34566");
    return objectMapper.writeValueAsString(stringStringMap);
    }

    /**
    * 修改响应体
    * @param oldResponseBody 修改前的响应体
    * @return 修改够的响应体
    */
    public String changeResponseBody(String oldResponseBody){
    return "00000000";
    }

    }

    4.新建FilterConfig.class

    package com.example.my_project.config;

    import com.example.my_project.filter.HttpRequestFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    import javax.servlet.Filter;
    import java.util.List;

    /**
    * 过滤器配置
    */
    @Configuration
    public class FilterConfig {

    @Bean
    public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
    FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
    filterFilterRegistrationBean.setFilter(new HttpRequestFilter());
    filterFilterRegistrationBean.setOrder(-1);
    //过滤的请求
    filterFilterRegistrationBean.setUrlPatterns(List.of("/*"));
    return filterFilterRegistrationBean;
    }
    }
    
    
  • 相关阅读:
    正则表达式
    scrollTop
    css3
    错误整理
    jquery-2
    vscode_修改字体,使用Fira Code
    实例_一个循环嵌套函数
    js_getComputed方法和style属性关于读取样式的区别
    html_html5增强的文件上传域_使用FileReader读取文件内容
    html_html5增强的文件上传域_FileList对象与File对象
  • 原文地址:https://www.cnblogs.com/myDreamWillCometrue/p/15490217.html
Copyright © 2020-2023  润新知