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
   }
相关推荐
前端工作日常9 小时前
我学习到的Java中domain和dto区别
java·后端
码农学院9 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽10 小时前
【工具】pom文件的<packaging>
java·maven
l1564694810 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
布吉岛的石头11 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我1234512 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
baozhengw12 小时前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
M1A112 小时前
基于 Spring AOP 构建系统操作日志:从注解设计到异步落库的完整实战
java
RainCity13 小时前
Java Swing 自定义组件库分享(十五)
java·笔记·后端
farerboy13 小时前
23-Java 构造函数
java·后端