访问端过滤器
访问端过滤器的代码如下:
package ubsi.demo.filter;
import org.bouncycastle.util.encoders.Hex;
import rewin.ubsi.consumer.Context;
import rewin.ubsi.consumer.ErrorCode;
import java.nio.charset.StandardCharsets;
/** UBSI Consumer过滤器 */
public class Consumer implements Context.Filter {
boolean deal = false; // 是否需要加解密处理
@Override
/** 请求前置接口,返回:0-正常,-1-拒绝,1-降级(使用Mock数据) */
public int before(Context ctx) {
if ( "ubsi.demo.hello".equals(ctx.getService()) && "hello".equals(ctx.getEntry()) ) {
// 仅对ubsi.demo.hello服务的hello()接口做处理
String param = (String)ctx.getParam(0);
if ( param != null && !param.isEmpty() ) {
// 需要对参数进行加密处理
String enc_param = Hex.toHexString(param.getBytes(StandardCharsets.UTF_8)); // 将参数转换为16进制字符串(伪加密)
ctx.setParam(enc_param); // 将参数设置为加密后的字符串
ctx.setHeader(Container.HEADER_KEY, true); // 设置请求Header的加密标志
deal = true;
System.out.println("before: 参数 \"" + param + "\" 被加密为 \"" + enc_param + "\"");
}
}
return 0;
}
@Override
/** 请求后置接口 */
public void after(Context ctx) {
if ( deal && ctx.getResultCode() == ErrorCode.OK ) {
// 接口成功返回,且需要进行处理
String res = (String)ctx.getResultData();
String dec_res = new String(Hex.decode(res), StandardCharsets.UTF_8); // 将16进制字符串转换为实际结果(伪解密)
ctx.setResult(ErrorCode.OK, dec_res); // 将结果设置为解密后的字符串
System.out.println("after: 结果 \"" + res + "\" 被解密为 \"" + dec_res + "\"");
}
}
}
说明:
- 访问端过滤器是rewin.ubsi.consumer.Context.Filter接口的实现类
- 过滤器只对ubsi.demo.hello服务的hello()接口进行处理
- 过滤器处理后,会设置请求Header中的ubsi.demo.filter属性为true,表示参数已被加密