Java SpringBoot后端Filter包装请求(新增/覆盖请求头)

1.过滤器:TestFilter
java 复制代码
package com.visy.filter;

import cn.hutool.core.util.ObjectUtil;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class TestFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String testValue = request.getHeader("Test-Key");

        if (ObjectUtil.isNull(testValue)) {
            // 创建可修改的请求包装器
            MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(request);
            mutableRequest.addHeader("Test-Key", "hello");

            filterChain.doFilter(mutableRequest, response);
        } else {
            filterChain.doFilter(request, response);
        }
    }
}
2.请求包装器:MutableHttpServletRequest
java 复制代码
package com.visy.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;

public class MutableHttpServletRequest extends HttpServletRequestWrapper {
    private final Map<String, String> customHeaders;

    public MutableHttpServletRequest(HttpServletRequest request) {
        super(request);
        customHeaders = new HashMap<>();
    }

    public void addHeader(String name, String value) {
        this.customHeaders.put(name, value);
    }

    @Override
    public String getHeader(String name) {
        String headerValue = customHeaders.get(name);
        if (headerValue != null) {
            return headerValue;
        }
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    // Tips: 一定要写,不然@RequestHeader单个值的时候获取不到参数
    @Override
    public Enumeration<String> getHeaders(String name){
        String value = getHeader(name);
        if (value != null) {
            return Collections.enumeration(Collections.singletonList(value));
        }
        return super.getHeaders(name);
    }

    @Override
    public Enumeration<String> getHeaderNames() {
        Set<String> headerNames = new HashSet<>(customHeaders.keySet());
        Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (e.hasMoreElements()) {
            headerNames.add(e.nextElement());
        }
        return Collections.enumeration(headerNames);
    }
}
3.测试
java 复制代码
@PostMapping({"/test"})
   public void test( @RequestHeader Map<String, String> headers, @RequestHeader("Test-Key") String testKey, HttpServletRequest servletRequest) {
      System.out.println("testKey1: " + headers.get("Test-Key") ); //hello
      System.out.println("testKey2: " + testKey ); //hello
      System.out.println("testKey3: " + servletRequest.getHeader("Test-Key")); //hello
   }
相关推荐
云烟成雨TD16 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨16 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg32132116 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald17 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
@yanyu66617 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
殷紫川17 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月17 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming66617 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川17 小时前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo17 小时前
查看 Tomcat 的堆内存参数
java·tomcat