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
}