【问题标题】:Shall i use wrapper OR filter for addition of extra headers?我应该使用包装器或过滤器来添加额外的标题吗?
【发布时间】:2018-02-01 02:00:17
【问题描述】:

我有一个场景。由于某些实用程序依赖,标头没有被转发到我的 springboot 应用程序。所以我尝试制作一个过滤器并在其中创建一个请求包装器。 应该使用仅过滤器或仅包装器更好的解决方案是什么?

以下是我的代码。虽然它工作正常。我想对其进行优化。

@Component
public class AddVersionFilter implements Filter{
private static final Logger log = 
LoggerFactory.getLogger(AddVersionFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    // TODO Auto-generated method stub
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(httpRequest) {           

        public String getHeader(String name) {
            String header = super.getHeader(name);
            if(name.equalsIgnoreCase("Version") && header == null)
            {
                log.info("Setting Version");
                return "23";
            }
            else
            {
                log.info("other headers");
            return (header != null) ? header : super.getParameter(name); // Note: you can't use getParameterValues() here.
            }
        }

        public Enumeration<String>getHeaderNames() {
            List<String> names = Collections.list(super.getHeaderNames());
            names.addAll(Collections.list(super.getParameterNames()));
            names.add("Version");
            log.info(names.toString());
            return Collections.enumeration(names);

        }

    };

    chain.doFilter(wrapper, response);
    log.info(" schema version " +httpRequest.getHeader("Version"));

}

@Override
public void destroy() {
    // TODO Auto-generated method stub

}

}

【问题讨论】:

    标签: servlets servlet-filters


    【解决方案1】:

    所以我尝试制作一个过滤器并在其中创建一个请求包装器。应该使用仅过滤器或仅包装器更好的解决方案是什么?

    包装器和过滤器应该结合使用。您在过滤器中创建一个包装器,并在对chain.doFilter(...) 的调用中传递该包装器。你上面的代码就是这样写的,很好。

    几个观察结果

    1. 在调用 getHeader...() 时返回参数名称和值是否正常?我在您的代码中的两个地方看到了这一点。您可能需要检查默认请求对象的行为。

    2. 您可能希望从 HttpServletRequestObject 覆盖 getHeaders(name)

    【讨论】:

    • 目的是返回非空值,即使它被设置为参数。
    猜你喜欢
    • 2023-02-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2019-02-10
    相关资源
    最近更新 更多