自定义修改Request请求
需求
在实际的开发过程中,需要修改Request请求,比如适配第三方系统的认证方式,而又不想修改它的源码,所以在每次请求之前做一次token转换,达到适配的目的。
为了防止内容的随意篡改,一般的HttpServletRequest是不可变的,但是Spring提供了一个Wrapper,可以让用户自定义Request,修改里面的内容。
ps:之前也在网上搜罗过,但是内容确实参差不齐,所以才有了本文
方案
核心代码:
public class CustomHttpServletRequest extends HttpServletRequestWrapper {
//可修改的Headers
private Map<String,String> headers=new HashMap<>();
//可修改的URI后面的参数,修改参数见博客:lino.chat
public CustomHttpServletRequest(HttpServletRequest request){
super(request);
}
public void addHeader(String name,String value){
headers.put(name, value);
}
@Override
public String getHeader(String name) {
String value=super.getHeader(name);
if (headers.containsKey(name)){
value=headers.get(name);
}
return value;
}
@Override
public Enumeration<String> getHeaderNames() {
List<String> names= Collections.list(super.getHeaderNames());
names.addAll(headers.keySet());
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
List<String> list= Collections.list(super.getHeaders(name));
if (headers.containsKey(name)){
list.add(headers.get(name));
}
return Collections.enumeration(list);
}
}
使用:
CustomHttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest);
if (existOnHeader(httpRequest)){
// 创建自定义请求,附加新Token到Header
customRequest.addHeader(PARAM_TOKEN, newToken);
}else if (existOnURI(httpRequest)){
}
有问题欢迎一块讨论。