有时通过过滤器 Filter 与包装 HttpServletRequest 添加自定义 header;非常有用。有类似如下一些场景:
- 通过网关转发到应用服务,都会透传一个 long 类型的用户 id;有个灰度方案,通过这个用户 id 取余进行灰度逻辑;想在每个请求都添加一个灰度的请求头 grey-flag。这时就需要向 HttpServletRequest 添加请求。默认 HttpServletRequest 是没有提供类型 addHeader(name, value) 或者 setHeader(name, value) 的方法的。
- 项目有时候为了简化业务逻辑,想在 Filter 中统一添加一些 Header 信息。比如使用 token 获取到 userId 后,添加到 Header 中,这样各个业务就可以直接使用 userId。
定义 HttpServletRequest 包装类
代码语言:javascript复制import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
/**
* Filter请求拦截中添加header属性
*
*/
public class CustomRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String> headerMap = new HashMap<String, String>();
public CustomRequestWrapper(HttpServletRequest request) {
super(request);
}
public void addHeader(String name, String value) {
headerMap.put(name, value);
}
@Override
public String getHeader(String name) {
String headerValue = super.getHeader(name);
if (headerMap.containsKey(name)) {
headerValue = headerMap.get(name);
}
return headerValue;
}
@Override
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
for (String name : headerMap.keySet()) {
names.add(name);
}
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
List<String> values = Collections.list(super.getHeaders(name));
if (headerMap.containsKey(name)) {
values.add(headerMap.get(name));
}
return Collections.enumeration(values);
}
}
自定义Filter
代码语言:javascript复制public class CustomHeaderFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
CustomRequestWrapper requestWrapper = new CustomRequestWrapper(req);
//获得请求参数中的token值
String token = request.getParamter("token");
if(!StringUtils.isEntry(token)){
// TODO 处理token调用addHeader方法
}
chain.doFilter(request, response);
// Goes to default servlet.
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}