
Spring中自定义Request请求
自定义修改Request请求
需求
在实际的开发过程中,需要修改Request请求,比如适配第三方系统的认证方式,而又不想修改它的源码,所以在每次请求之前做一次token转换,达到适配的目的。
为了防止内容的随意篡改,一般的HttpServletRequest是不可变的,但是Spring提供了一个Wrapper,可以让用户自定义Request,修改里面的内容。
ps:之前也在网上搜罗过,但是内容确实参差不齐,所以才有了本文
方案
核心代码:
public class CustomHttpServletRequest extends HttpServletRequestWrapper {
//可修改的Headers
private Map<String,String> headers=new HashMap<>();
//可修改的URI后面的参数
private Map<String, String[]> params;
public CustomHttpServletRequest(HttpServletRequest request){
super(request);
this.params = new HashMap<>(request.getParameterMap());
}
public void addHeader(String name,String value){
headers.put(name, value);
}
public void addParameter(String name,String[] value){
params.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);
}
@Override
public String getParameter(String name) {
String[] vs = params.get(name);
if (vs == null || vs.length < 1) {
return null;
}
return vs[0];
}
@Override
public Enumeration getParameterNames() {
return new Vector(params.keySet()).elements();
}
@Override
public String[] getParameterValues(String name) {
String[] vs = params.get(name);
if (vs == null || vs.length < 1) {
return null;
}
return vs;
}
}
使用:
CustomHttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest);
if (existOnHeader(httpRequest)){
// 创建自定义请求,附加新Token到Header
customRequest.addHeader(PARAM_TOKEN, newToken);
}else if (existOnURI(httpRequest)){
customRequest.addParameter(PARAM_TOKEN,new String[]{newToken});
}
有问题欢迎一块讨论。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Lino
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果