zuulFilter使用总结
pre:可以在请求被路由之前调用
route:在路由请求时候被调用
post:在route和error过滤器之后被调用
error:处理请求时发生错误时被调用
一、拦截request请求,对请求进行修改(pre/route)
1.修改url地址
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request
String uri = request.getRequestURI();
LOG.info("=======old uri: "+uri);
uri += "";
ctx.put(FilterConstants.REQUEST_URI_KEY, uri);
LOG.info("=======new uri: "+ctx.getRequest().getRequestURI());
2.修改get请求参数
RequestContext ctx = RequestContext.getCurrentContext();
Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();
if (requestQueryParams==null) {
requestQueryParams=new HashMap<>();
}
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("value");
requestQueryParams.put("key", arrayList);
ctx.setRequestQueryParams(requestQueryParams);
3.修改post请求参数
try{
ServletInputStream inputStream = ctx.getRequest().getInputStream();
String params = StreamUtils.copyToString(inputStream, Charset.forName("UTF-8"));
LOG.info("======原先参数为: "+params);
JsonObject jsonObject = new JsonParser().parse(params).getAsJsonObject();
jsonObject.addProperty("key","value");
String newParam = new Gson().toJson(jsonObject).toString();
ctx.setRequest(new HttpServletRequestWrapper(ctx.getRequest()) {
@Override
public ServletInputStream getInputStream(){
return new ServletInputStreamWrapper(newParam.getBytes());
}
@Override
public int getContentLength() {
return newParam.getBytes().length;
}
@Override
public long getContentLengthLong() {
return newParam.getBytes().length;
}
});
LOG.info("======修改后的参数为: "+StreamUtils.copyToString(ctx.getRequest().getInputStream(), Charset.forName("UTF-8")));
} catch (Exception e) {
e.printStackTrace();
}
二、拦截response请求,修改响应参数(post)
try {
InputStream stream = ctx.getResponseDataStream();
String body = StreamUtils.copyToString(stream, Charset.forName("UTF-8"));
JsonObject resObject = new JsonParser().parse(body).getAsJsonObject();
if(resObject.has("error")){
resObject.addProperty("code",-1);
}else{
resObject.addProperty("code",1);
}
String newBody = resObject.toString();
ctx.setResponseBody(newBody);
LOG.info("====返回结果:"+ctx.getResponseBody());
}catch (Exception e){
e.printStackTrace();
}