使用场景
在使用Dubbo的过程中,我们有时需要做一些过滤拦截的操作,比如字符编码、黑名单等,这时可以使用过滤器来处理。
Filter过滤器
Dubbo 使用Filter,需要实现Filter接口,重写方法。
注意,引入的Filter是com.alibaba.dubbo.rpc包的。
示例如下:
import com.alibaba.dubbo.rpc.*;
public class ContextFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(ContextFilter.class);
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {
try {
//获取request请求
HttpServletRequest request= (HttpServletRequest)RpcContext.getContext().getRequest();
//设置字符编码,也可以是其他的内容
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error("ContextFilter error.", e);
}
return invoker.invoke(invocation);
}
}
配置Filter
在这个路径下 src/main/resources/META-INF 添加文件夹,名称为 dubbo,
在dubbo文件夹下添加一个文件(注意,这个是文件),名称为 com.alibaba.dubbo.rpc.Filter 。
变量名随意取,值为Filter类的路径 ,如下 :
charFilter=com.service.filter.ContextFilter
使用Filter
在dubbo配置文件中的 <dubbo:service />里面,添加 Filter属性。如下:
<dubbo:service /> 用于暴露服务。添加filter就可以进行过滤了,对应的值为 com.alibaba.dubbo.rpc.Filter文件中的变量名。
<bean class="com.service.impl.UserServiceImpl" id="userService"/>
<dubbo:service document="userServiceCofiguration" interface="com.service.UserService" protocol="rest" ref="userService" filter="charFilter"/>
添加filter属性后,就可以使过滤器生效了。