本文对移动网关 RPC 拦截器、RPC 请求头、RPC Cookie、RPC 签名的设置进行说明。
重要
在 10.2.3 基线中新增设置 RPC 签名内容。
RPC 拦截
在业务开发中,如果在某些情况下需要控制客户端的网络请求(例如拦截网络请求,禁止访问某些接口,或者限流),可以通过 RPC 拦截器实现。
创建全局拦截器
public class CommonInterceptor implements RpcInterceptor {
/**
* 前置拦截:发送 RPC 之前回调。
* @param proxy RPC 代理对象。
* @param clazz rpcface 模型类,通过 clazz 参数可以判断当前调用的是哪个 RPC 模型类
* @param method 当前 RPC 调用的方法。
* @throws RpcException
* @return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
*/
@Override
public boolean preHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
Annotation annotation,
ThreadLocal<Map<String, Object>> extParams)
throws RpcException {
//Do something...
return true;
}
/**后置拦截:发起 RPC 成功之后回调。
*@return true 表示继续向下执行,false 表示中断当前请求,抛出 RpcException,错误码:9。
*/
@Override
public boolean postHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
Annotation annotation) throws RpcException {
//Do something...
return true;
}
/**
* 异常拦截:发起 RPC 失败之后回调。
* @param exception 表示当前 RPC 出错异常。
* @return true 表示将当前异常继续向上抛出,false 表示不要抛出异常,正常返回,没有特殊需求,切勿返回 false。
*/
@Override
public boolean exceptionHandle(Object proxy,
ThreadLocal<Object> retValue,
byte[] retRawValue,
Class<?> clazz,
Method method,
Object[] args,
RpcException exception,
Annotation annotation) throws RpcException {
//Do something...
return true;
}
}
注册拦截器
在框架启动过程中,初始化 RpcService
时,将拦截器注册上去,例如:
public class MockLauncherApplicationAgent extends LauncherApplicationAgent {
public MockLauncherApplicationAgent(Application context, Object bundleContext) {
super(context, bundleContext);
}
@Override
public void preInit() {
super.preInit();
}
@Override
public void postInit() {
super.postInit();
RpcService rpcService = getMicroApplicationContext().findServiceByInterface(RpcService.class.getName());
rpcService.addRpcInterceptor(OperationType.class, new CommonInterceptor());
}
}
设置 RPC 请求头
在 MainActivity
类的 initRpcConfig
方法中,设置 RPC 请求头。具体参考 代码示例。
private void initRpcConfig(RpcService rpcService) {
//设置请求头
Map<String, String> headerMap = new HashMap<>();
headerMap.put("key1", "val1");
headerMap.put("key2", "val2");
rpcInvokeContext.setRequestHeaders(headerMap);
}
设置 RPC cookie
设置 cookie
通过调用以下接口来进行 RPC cookie 设置。其中,Your domain
的规则是网关 URL 的第一个 .
以及其后第一个 /
之前的所有内容。例如,网关 URL 为 http://test-cn-hangzhou-mgs-gw.cloud.alipay.com/mgw.htm
,那么 Your domain
则是 .cloud.alipay.com
。
GwCookieCacheHelper.setCookies(Your domain, cookiesMap);
移除 cookie
通过调用以下接口即可移除设置的 cookie。
GwCookieCacheHelper.removeAllCookie();
设置 SM3 验签
在 RPC 初始化之后,可以通过MPRpc
类的 setGlobalSignType
方法,来指定全局验签方式为 sm3 类型。
MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);
设置 RPC 签名
接口
class TransportConstants {
public static final int SIGN_TYPE_DEFAULT = 0; // 默认签名方式,即 md5
public static final int SIGN_TYPE_MD5 = 1; // md5
public static final int SIGN_TYPE_HMACSHA256 = 3; // hmacsha256
public static final int SIGN_TYPE_SHA256 = 4; // sha256
public static final int SIGN_TYPE_SM3 = 5; // sm3
}
// 全局 rpc 签名算法设置
MPRpc.setGlobalSignType(int signType);
示例
设置全局 RPC signType,且对所有 RPC 生效。
// 设置签名方式为SM3
MPRpc.setGlobalSignType(TransportConstants.SIGN_TYPE_SM3);
文档内容是否对您有帮助?