如何向出站请求添加自定义标头?
目前,我的课程是:
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import javax.servlet.Filter;
public class MySecurityConfiguration extends WebSecurityConfigurerAdapter implements Filter {
用例是:
我收到一个入站(某人,一个客户端调用我的应用程序)请求。我需要首先提取一个特定的头,并对这个特定的头键和值执行一些计算。
我需要通过一个出站请求调用第三方api(这次,我是客户机,我需要调用另一个服务器),以便获得一些值。
当我调用这个第三方api时,这次轮到我向我将要发出的出站请求注入一个自定义头键值。
我之所以说“我注入”是因为我使用的是一个我几乎无法控制的客户机库,而客户机库将把http请求发送出去。
为了避免混淆,至少从逻辑和算法的Angular 来看,第1步和第2步并不相关。我只是详细说明了这些步骤(比如我不需要将步骤1中的头插入步骤2中等等…)
现在,为了执行步骤2,我使用众所周知的
final class MutableHttpServletRequest extends HttpServletRequestWrapper {
// holds custom header and value mapping
private final Map<String, String> customHeaders;
public MutableHttpServletRequest(HttpServletRequest request) {
super(request);
this.customHeaders = new HashMap<>();
}
public void addHeader(String name, String value) {
this.customHeaders.put(name, value);
}
public String getHeader(String name) {
// check the custom headers first
String headerValue = customHeaders.get(name);
if (headerValue != null) {
return headerValue;
}
// else return from into the original wrapped object
return ((HttpServletRequest) getRequest()).getHeader(name);
}
public Enumeration<String> getHeaderNames() {
// create a set of the custom header names
Set<String> set = new HashSet<String>(customHeaders.keySet());
// now add the headers from the wrapped request object
@SuppressWarnings("unchecked")
Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
while (e.hasMoreElements()) {
// add the names of the request headers into the list
String n = e.nextElement();
set.add(n);
}
// create an enumeration from the set and return
return Collections.enumeration(set);
}
}
我认为,自2016年以来,这种变化和其他变化都可以在网上找到。
我在想,因为我已经在用了 WebSecurityConfigurerAdapter
以便“过滤/截获”入站请求并验证自定义标头。
有没有可能使用类似的注入自定义头到一个出站请求请?
不知何故,我有一种感觉,我现在正在做的事情过于复杂化,可能会有一个更优雅和有效的解决方案,而不是 extends HttpServletRequestWrapper
+
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String someImportantValue = computeSomeCustomeHeaderValue();
MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(httpRequest);
mutableRequest.addHeader("X-Some-Custom-Header", someImportantValue);
chain.doFilter(mutableRequest, response);
}
1条答案
按热度按时间a14dhokn1#
可以使用
org.apache.catalina.filters.RemoteIpFilter.XForwardedRequest
```@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
final String result = getSomeNewHeader();
final HttpServletRequest httpRequest = (HttpServletRequest) request;
final XForwardedRequest xForwardedRequest = new XForwardedRequest(httpRequest);
xForwardedRequest.setHeader("additionalHeader", httpRequest);
chain.doFilter(xForwardedRequest, response);
}