我应该使用包装器或过滤器来添加额外的标头吗?

时间:2017-08-23 12:56:15

标签: servlets servlet-filters

我有一个场景。由于一些实用程序依赖项标头没有被转发到我的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

}

}

1 个答案:

答案 0 :(得分:0)

  

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

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

观察结果

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

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