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
   }
相关推荐
Tian_Hang3 分钟前
Eclipse Ditto 物模型相关代码
java·运维·服务器·ide·eureka·eclipse
Mr-Wanter1 小时前
wsl2 jdk管理工具之sdkman
java·开发语言·sdkman
唐青枫2 小时前
Java Future 与 CompletableFuture 实战指南:从异步结果到任务编排
java
长孙豪翔2 小时前
在.net中读写config文件的各种方法
java·数据库·.net
tachibana22 小时前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
可乐ea2 小时前
【Java八股|第10篇】Java 中的包装类和自动拆装箱
java·面试题·包装类·java八股
zfoo-framework2 小时前
mongo最佳实战(from mongo中文社区)
java
深盾科技_Virbox3 小时前
加密狗授权能力选型:从授权模型到全生命周期管理
java·网络·数据库
iPad协议个微协议3 小时前
企业微信文件上传下载在自动化系统中的处理方式
java·运维·人工智能·机器人·自动化·企业微信
. . . . .3 小时前
Egg框架深入
java·开发语言