ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一次更换BeanUtils引发的惨案

2022-05-25 03:31:07  阅读:167  来源: 互联网

标签:info log BeanUtils 惨案 user principal 更换 subject


原由是这样的,原先代码里copyProperties用的是 org.apache.commons.beanutils.BeanUtils,奈何这位老哥不太给力,source里的Date类型如果为空的话会报错。于是给改用了org.springframework.beans.BeanUtils; 结果线上发生了一个匪夷所思的问题。看下面代码:

 Subject subject = SecurityUtils.getSubject();                
Object principal =  subject.getPrincipal();
            log.info("principals is {}",JsonUtil.toJSONString(subject.getPrincipals().asSet().toArray()));
            if(principal != null) {
                ShopguideUser user=(ShopguideUser)principal;
                log.info("user = {}", JsonUtil.toJSONString(user));
                BeanUtils.copyProperties(userInfo,user);
                ShopguideUserAccount account = accountService.getUserAccount(user.getId());
                BeanUtils.copyProperties(account,userInfo );
                return userInfo;    

我这里因为想统一通过dubbo的filter传一些参数:

@Activate(group = {Constants.CONSUMER},order = -10000)
@Slf4j
public class ConsumerFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        try {
//            RpcInvocation invocation1 = (RpcInvocation) invocation;
            Subject subject = SecurityUtils.getSubject();
            ShopguideUser user = null;

            Object principal =  subject.getPrincipal();
            if(!subject.isAuthenticated()) {
                log.info("not authenticated principal = {}",principal);
            }else{
                log.info("authenticated principal = {}",principal);
            }

            if(principal != null) {
                log.info("principal = {}", JsonUtil.toJSONString(principal));
                log.info("principals is {}",JsonUtil.toJSONString(subject.getPrincipals().asSet().toArray()));
                user=(ShopguideUser)principal;
                RpcContext.getContext().setAttachment( Constant.AUTH_USER, user.getId().toString());
            }

但这上面的principal明明有值,到了ConsumerFilter的principal就是个空对象{}了? 因为运行这两段程序绝对是在一个线程里发生的。怎么principal平白无故被改了?原来坑爹的是spring的BeanUtils的参数和apache的是相反的,user对象被覆盖了,变成了空对象!血的教训。

 

标签:info,log,BeanUtils,惨案,user,principal,更换,subject
来源: https://www.cnblogs.com/zjhgx/p/16307907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有