我有一个场景。由于一些实用程序依赖项标头没有被转发到我的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
}
}
答案 0 :(得分:0)
所以我尝试创建一个过滤器并在其中创建了一个请求包装器。什么是更好的解决方案只使用过滤器或只使用包装?
包装和过滤器应结合使用。您在过滤器中创建一个包装器,并在调用chain.doFilter(...)时传递包装器。上面的代码就是这样编写的,并且很好。
观察结果
在调用getHeader ...()时返回参数名称和值是否正常?我在你的代码中的两个地方看到了这一点。您可能想要检查默认的请求对象行为。
您可能希望从HttpServletRequestObject中覆盖getHeaders(name)。