最近在和银行对接服务,当然我们是服务提供方。银行对数据传输安全性要求很高,意识形态里比较看重数据是否加密传输。当然我们的请求是https,但是现在各种代理拦截工具层出不穷,依然是可以截获请求内容。
为了应对甲方要求的安全,我们将数据加密后再已流的方式传输给服务端。本来以为会一帆风顺,但是中间遇到了奇怪的问题,网关可以正常解析数据,但是转发到微服务后,微服务无法通过getParameter方式获取参数。
这个问题必须在网关层面处理,如果渗透到微服务,工作量就太大了。
各种debug后,发现了根本原因。app端发过来的请求,content-type是text/plain。
当我们将字符流反解后拼成key=value&key=value 重写request,服务端不会按默认的http请求方式解析key value。
那么方案就有了,app端通过text/plain 传递到网关,网关解析数据重组request,
重新设置Content-Type既可。
```
context.addZuulRequestHeader("Content-Type", "application/x-www-form-urlencoded")
```
解决过滤器中无法getParameter
```
public HttpServletRequestWrapper newReqWrapper(HttpServletRequest request, byte[] bytes,Map<String,String> paramMap) {
return new HttpServletRequestWrapper(request) {
@Override
public ServletInputStream getInputStream() throws IOException {
return new ServletInputStreamWrapper(bytes);
}
@Override
public int getContentLength() {
return bytes.length;
}
@Override
public long getContentLengthLong() {
return bytes.length;
}
//覆盖getParameter
@Override
public String getParameter(String name) {
return paramMap.get(name);
}
};
}
```