dubbo + shiro提供者(provider)获取不了SecurityUtils用户信息的问题

文章讲述了作者在将SpringBoot项目迁移到Dubbo时遇到的上下文信息问题,由于登录逻辑在Consumer中,导致RPC调用时用户信息丢失。通过使用Dubbo的上下文配置和Filter解决方法,将用户信息传递到Provider。虽然增加了网络传输数据,但仍提供了有效解决方案。
摘要由CSDN通过智能技术生成

导读:最近的一个项目,将springboot更改为dubbo,
但出现了上下文信息的问题,获取不到用户信息,于是弄了很多方法都不成功,经过n个小时后给了一个备用方案给大家参考

项目结构

这个项目分为两个很简单的目录,就是提供者(provider)和消费者(consume)两个文件夹,
这边引用dubbo官方文档的例子:
消费端:11
provider放入service结构,consumer放入Controller结构(这个重点)

问题及原因

这个项目造成的问题有一个前提,就是它的登录逻辑是在consumer里,其它业务逻辑在provider的service目录里(是有点离谱)。
所以问题就来了,在接口处,能获取到信息:

在这里插入图片描述
但是一旦进行rpc调用到service层,ok直接变为null(wtf)
在这里插入图片描述
原因就是上面我说的前提,否则的话,就是controller没值,而service有值

如何解决

网上看了一堆帖子,有说xml的,有说写bean的,试了好多次都是失败的,于是转换思路:既然consumer有数据,能不能在rpc调用的时候,把这个参数传到provider呢?于是看到官网有个上下文配置+filter过滤器的特性,刚好可以解决

文章:
dubbo-上下文
dubbo-filter
先说明一下什么是上下文:这里引用官方说法

上下文信息是一次 RPC 调用过程中附带的环境信息,如方法名、参数类型、真实参数、本端/对端地址等。这些数据仅属于一次调用,作用于 Consumer 到 Provider 调用的整个流程。

至于过滤器filter,实际类似aop,需要的直接看链接吧。
所以思路是这样的:
在consumer-filter中,设置上下文信息,这样provider就可以直接接到上下文的信息,即用户信息了,开搞。
以下流程直接复用官方文档即可,在次贴出

实战

Maven 项目结构:

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxFilter.java (实现Filter接口)
    |-resources
        |-META-INF
            |-dubbo
                |-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)

XxxFilter.java:

@Activate(group = "consumer")
public class XxxFilter implements Filter {
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        // before filter ...
        Result result = invoker.invoke(invocation);
        // after filter ...
        return result;
    }
}

META-INF/dubbo/com.alibaba.dubbo.rpc.Filter(路径要完全正确,不要txt后缀):

xxx=com.xxx.XxxFilter

在XxxFilter的before 中,放入上下文

//放置用户上下文
        final User user = //获取user;
        String userInfo;
        if (user != null) {
            userInfo = JSON.toJSONString(user);
        }
        invocation.getAttachments().put(
        	"dubboUserKey", //key
        	StringUtils.isBlank(userInfo) ? JSON.toJSONString(new SysUser()) : userInfo
        );

这几个文件编写完,provider就可以根据RpcContext.getContext().getAttachments()方法发现数据了
在这里插入图片描述

解决及其它

至此是解决了,但是还有个小问题,就是这样造成的网络传输会多一点数据,不算特别完美。
如果有别的好的方法,欢迎评论区评论

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值