berg369
2020-07-01 14:18
采纳率: 85.7%
浏览 483
已采纳

当前用户大家怎么设计?是在Service层方法中作为参数传入,还是作为公共方法任何地方获取?

当前用户是系统中很特别的一个对象,其实就是会话跟踪,可以用session或者请求中带token,通常统一处理比如在过滤器中,得到当前用户对象放在request的属性中(或者线程变量中),然后

方式1:设计一个静态方法得到当前用户,controller和Service层代码均可访问; 方式2:Controller可以访问得到,service层代码则作为方法参数传入。
请问你们是怎么实现的?

方式2作为Service方法参数缺点是所用用到的方法都要加一个当前用户参数,优点是较为独立通用特别是RPC调用时,rpc调用时并不走过滤器等统一处理,rpc调用是直接访问Service层,所以避免与会话牵扯更好吧。

这里我比较纠结,获取当前用户在很多方法中都会用到,作为参数传递是否太繁琐?请指导,谢谢!

琢磨半天,决定用service方法参数,有数据权限控制的方法就要传入当前用户id,这样会话层只在Controller而不侵入service层,接口远程调用时比较简单,远程我们用dubbo或hessian,方法参数中有了,就不必用外部方法传递用户了(比如通过dubbo的filter或hessian的header传递附件的值)。
但是随后,我想到了一个安全问题。“当前用户”应由系统产生和维护的,不应像普通用户是随便调用的,在方法参数中就会面临调用者传入错误的用户id的问题?无论是查到了别人的数据还是把操作者置为了其他用户都是严重问题。算了吧,还是不要用参数方式了,就算是远程调用,也要通过filter或header传递token。

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

4条回答 默认 最新

  • threenewbee 2020-07-01 15:26
    最佳回答

    从面向对象的角度看,最好是抽象出一个接口,用spring等AOP注入,不要自己传参数,更不要作为公共方法任何地方获取
    道理很简单,一旦你那样做,意味着“当前用户”这个功能基本上和所有的类斗耦合上了,再也不能修改了。
    特别是你希望将来为了性能用多机方案,不用session,或者要匹配第三方登录等功能性扩展的时候,代码美发动,会很痛苦。

    评论
    解决 无用
    打赏 举报
查看更多回答(3条)

相关推荐 更多相似问题