java—使用SpringSecurity向现有头添加自定义头?

nnsrf1az  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(614)

如何向出站请求添加自定义标头?
目前,我的课程是:

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);
}
a14dhokn

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);
}

无需重新编写 Package 器

相关问题