消费者过滤器,给service层传递用户信息参数
package com.mr.common.filter;
import com.alibaba.fastjson.JSON;
import com.mr.common.constant.Constant;
import com.mr.modules.security.user.UserContext;
import com.mr.modules.security.user.UserDetail;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
/**
* 登录用户信息消费者过滤器,跨服务传递用户信息参数
*
* @author zhuyoulong
* @date 2023/7/31
*/
@Slf4j
@Activate(group = CommonConstants.CONSUMER)
public class DubboUserInfoConsumerFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
UserDetail user = UserContext.getUser();
String userInfo;
if (user != null) {
userInfo = JSON.toJSONString(user);
} else {
userInfo = RpcContext.getContext().getAttachment(Constant.DUBBO_USER_KEY);
}
invocation.getAttachments().put(Constant.DUBBO_USER_KEY, StringUtils.isBlank(userInfo) ? JSON.toJSONString(new UserDetail()) : userInfo);
return invoker.invoke(invocation);
}
}
生产者过滤器,接收消费者过滤器传递的用户信息
package com.mr.common.filter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.mr.common.constant.Constant;
import com.mr.modules.security.user.UserContext;
import com.mr.modules.security.user.UserDetail;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
/**
* dubbo生产者用户过滤器
*
* @author zhuyoulong
* @date 2023/7/31
*/
@Slf4j
@Activate(group = CommonConstants.PROVIDER)
public class DubboUserInfoProviderFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String userJson = RpcContext.getContext().getAttachments().get(Constant.DUBBO_USER_KEY);
if (userJson == null || userJson.contains("{}")) {
return invoker.invoke(invocation);
}
UserDetail userDetail = JSON.parseObject(userJson).toJavaObject(new TypeReference<UserDetail>() {
});
UserContext.setUser(userDetail);
return invoker.invoke(invocation);
}
}
在生产者项目的resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
dubboUserInfoProviderFilter=com.mr.common.filter.DubboUserInfoProviderFilter
注意这里的Filter第一个字母必须大写,否则在linux环境会提示找不到这个文件,有大小写的问题,如果服务启动出现这个异常No such extension Filter for filter/com.alibaba.dubbo.rpc.Filter,可能Filter的F没大写,我就是写成filter就报这个错误。
生产者application.yml
dubbo:
provider:
#去除dubbo默认异常处理过滤器,改用自己的,生产者过滤器
filter: -exception,dubboUserInfoProviderFilter
在生产者项目的resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
dubboUserInfoConsumerFilter=com.mr.common.filter.DubboUserInfoConsumerFilter
消费者application.yml
dubbo:
provider:
#去除dubbo默认异常处理过滤器,改用自己的
filter: -exception
consumer:
filter: dubboUserInfoConsumerFilter
这样就可以了