spring web中对http请求的reponse进行包装

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;

/**
 * @date 2021-05-05
 */
public class HttpResponseWrapper extends HttpServletResponseWrapper {

    /**
     * 我们的分支流
     */
    private ByteArrayOutputStream output;

    private ServletOutputStream filterOutput;

    public HttpResponseWrapper(HttpServletResponse response) {
        super(response);
        output = new ByteArrayOutputStream();
    }

    /**
     * 原理就是往response流中写入时,也往我们的ByteArrayOutputStream流中写入一份
     */
    @Override
    public ServletOutputStream getOutputStream() {
        if (filterOutput == null) {
            filterOutput = new ServletOutputStream() {

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

                @Override
                public void setWriteListener(WriteListener writeListener) {

                }

                @Override
                public void write(int b) throws IOException {
                    HttpResponseWrapper.super.getOutputStream().write(b);
                    output.write(b);
                }


            };
        }
        return filterOutput;
    }

    public byte[] toByteArray() {
        return output.toByteArray();
    }

}

 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

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

/**
 * @date 2021-05-05
 */
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@WebFilter(urlPatterns = {"/*"}, filterName = "httpResponseWrapperFilter")
public class HttpResponseWrapperFilter extends OncePerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(HttpResponseWrapperFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        if (needWrapper(request.getRequestURI(), request.getMethod())) {
            HttpResponseWrapper wrapper = new HttpResponseWrapper(response);
            try {
                filterChain.doFilter(request, wrapper);
            } catch (IOException | ServletException e) {
                throw e;
            }
            try {
                // 获取到返回结果
                String respStr = new String(wrapper.toByteArray(), response.getCharacterEncoding());
                // TODO

            } catch (Throwable e) {
                logger.error("录制时发生异常", e);
            }
            return;
        } else {
            // 不做任何操作
            filterChain.doFilter(request, response);
        }
    }

    private boolean needWrapper(String uri, String method) {
        // TODO
        return true;
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过创建一个类,继承`org.springframework.web.server.WebFilter`接口,并实现其`filter`方法来实现请求拦截和响应的相关操作。以下是一个可能的示例代码: ```java import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; @Component @Order(1) // 设置过滤器的顺序 public class UserFilter implements WebFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { String url = exchange.getRequest().getURI().toString(); if (url.contains("user")) { // 在请求包含"user"的URL进行拦截 String responseMessage = "相关信息"; // 设置响应信息 // 在响应写入相关信息 exchange.getResponse().getHeaders().add("X-User-Info", responseMessage); } return chain.filter(exchange); // 继续执行过滤器链 } } ``` 在上述示例,`UserFilter`类通过`@Component`注解将其注册为Spring组件,并通过`@Order`注解设置其执行顺序。在`filter`方法,我们首先获取请求的URL,并检查是否包含"user"关键字。如果是,则在响应头添加`X-User-Info`字段,并设置相关信息作为值。 最后,通过调用`chain.filter(exchange)`方法,将请求继续传递给下一个过滤器或处理器。这样,你就可以对请求包含"user"的请求进行拦截,并在响应写入相关信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值