在 Spring Boot JAVA 中将自定义标头注入 ServletRequest

苏拉·夏尔马

我需要将自定义标头注入 Spring Boot 应用程序收到的每个请求中,为此,我编写了一些代码,但似乎没有完成它的工作。简而言之,我已经实现了 Filter 接口并定义了 doFilter 方法,扩展了 HttpServletRequestWrapper 类,并覆盖了 getHeader() 和 getHeaderNames() 方法以考虑我从属性文件中读取的自定义标头。

但是,当我进入控制器并检查请求时,我没有获得通过 MyReqWrapper 设置的自定义标头。下面是代码,我也试过在 Stackoverflow 中搜索它,但找不到关于什么是/可能是错的解决方案。有人可以指出我正确的方向吗?

另外,请指点我如何测试是否实际设置了自定义标题。

这是过滤器实现

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ReqFilter implements Filter {
    private static final String CUSTOMHEADERENABLED = "customheadersenabled";
    private static final String CUSTOMHEADERCOUNT = "customheaderscount";
    
    @Autowired
    private Environment env;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        try {
            boolean customHeadersEnabled = Boolean.parseBoolean(env.getProperty(CUSTOMHEADERENABLED, "false"));
            int count = Integer.parseInt(env.getProperty(CUSTOMHEADERCOUNT, "0"));

            if (customHeadersEnabled && count > 0) {
                MyReqWrapper myReq = new MyReqWrapper((HttpServletRequest) servletRequest);
                myReq.processMyHeaders(count, env);
                filterChain.doFilter(customRequest, servletResponse);
            } else {
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
        catch(ServletException ex){
            throw ex;
        }
    }

    @Override
    public void destroy() {
        //
    }
}

这是扩展 HttpServletRequestWrapper 的自定义请求包装器

final class MyReqWrapper extends HttpServletRequestWrapper {
    private static final String CUSTOMHEADERPREFIX = "header1";
    private final Map<String, String> myHeaders;

    public MyReqWrapper(HttpServletRequest request) {
        super(request);
        myHeaders = new HashMap<>();
    }

    @Override
    public String getHeader(String name) {
        String headerValue = myHeaders.get(name);

        if (headerValue != null){
            return headerValue;
        }
        return ((HttpServletRequest) getRequest()).getHeader(name);
    }

    @Override
    public Enumeration<String> getHeaderNames() {
        Set<String> set = new HashSet<>(myHeaders.keySet());

        Enumeration<String> headerNames = ((HttpServletRequest) getRequest()).getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String n = headerNames.nextElement();
            set.add(n);
        }
        return Collections.enumeration(set);
    }

    public void processMyHeaders(int headerCount, Environment env) {
        while(headerCount > 0){
            String [] headerKeyValue = Objects.requireNonNull(env.getProperty(String.format("%1$s%2$s", CUSTOMHEADERPREFIX, headerCount--)))
                    .split(":");
            this.myHeaders.put(headerKeyValue[0], headerKeyValue[1]);
        }
    }
}

苏拉·夏尔马

这对我来说已经解决了,我忘了用答案更新它。

所以问题是我HttpServletRequest在 ReqFilter 和控制器类中使用来自两个不同命名空间的类,即一个来自"org.apache.catalina.servlet4preview.http.HttpServletRequest"另一个来自"javax.servlet.http.HttpServletRequest"

一旦我在两个文件中使用了统一命名空间,我就可以从控制器类访问头文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用<String,Integer>将自定义标头添加到Spring Boot HttpHeaders?

在Spring Boot Data Rest中将自定义端点公开到基本路径

用于Spring Boot REST API版本控制的自定义标头方法

如何在Spring Data Rest中将自定义标头添加到特定资源

Spring Boot:注入自定义上下文路径

自定义属性无法在 Spring Boot 中注入

如何在webflux中将spring boot websocket文本消息转换为自定义java对象(bean或DTO)

如何使用Spring Boot使用OAuth1.0和自定义标头对API进行身份验证

如何为Spring Boot应用程序设置自定义Http标头“服务器”

将自定义Response标头添加到Spring WebFlux contoller端点

Spring Boot CORS标头

如何使用Spring Boot Java Config编写自定义Apache Camel组件/端点

Thymeleaf 在没有 spring boot 的情况下调用自定义 java 类

spring-boot在Java中向执行器外壳添加自定义命令

当我尝试在Spring Boot应用程序中将自定义错误传递给客户端时发生异常

如何将Spring Boot Environment bean注入自定义Spring xml bean?

如何将自定义ApplicationContextInitializer添加到Spring Boot应用程序?

将自定义对象传递到Spring Boot Controller中

将自定义Thymeleaf模板解析器添加到Spring Boot

将自定义JVM参数添加到Spring Boot生成的bat / sh脚本

Spring boot 配置自定义sql

Spring Boot Actuator - 自定义端点

Spring Boot:配置自定义MethodSecurityExpressionOperations?

Spring Boot自定义HttpMessageConverter

Spring boot 禁用自定义 HealthIndicator

Spring是将自定义Http状态,标头和正文返回给Rest Client的最简单方法

来自自定义功能的Spring Boot执行器2指标

Spring Boot-Hibernate自定义约束不会注入服务

基于自定义标头的Spring Security antMatcher规则