请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师好, 我有个问题. 关于8-11使用LoginFilter来进行RequestHolder.add操作的疑问.

 为什么不在HttpInterceptor的preHandle里进行RequestHolder.add操作呢? 

preHandle根据url可以获得当前登录请求, 同样也可以用session判断当前用户是否存在. 然后在请求中进行RequestHolder.add.而且remove操作就在HttpInterceptor请求结束后.  希望老师抽空解答一下

正在回答

1回答

你好,就目前课程里的代码来说,你这样做可以达到相同的结果,这是没问题的。
说一下我这里为什么这样做。首先呢,这个类名字叫LoginFilter,从类名上我们就知道ta是用来处理登陆过滤的,因此逻辑写在这里很合适,也很容易找到,这里说的容易不光是指自己,而是团队。
在实际项目中,我们可能需要定义多个filter来解决不同的问题,控制好filter顺序,不同的filter做不同的事情。这时单独使用一个interceptor就不太好了,一个preHandle方法可能要不断堆积不同的业务方法。
另外,我们习惯是在interceptor里做所有接口都要做的事情,而Filter的话则可以限定只对某些接口做处理,不一定是所有接口都做处理。这里做登陆检查就是,我们只针对指定的接口拦截、检查就可以,不需要对所有接口做处理。Filter在初始化时就可以指定拦截的接口,以及全部放行的白名单接口列表。而interceptor针对所有接口,就比较适合记录所有接口请求日志,以及在接口处理完后做一些收尾处理。
这些基本上就是我在课程实现上使用filter来做而没使用interceptor来做的主要考虑点了。当实际项目之有一个filter时,或者filter很少时,使用interceptor来实现也没什么问题。
祝你学习愉快~

2 回复 有任何疑惑可以回复我~
  • 提问者 banjuer #1
    感谢Jimin老师的耐心解答. 我有个想法, 关于追踪用户请求处理日志的. 需求是想每一条日志都有一个当前请求操作的ID, 便于定位当前日志是属于哪个请求输出的.
    RequestHolder添加一个ThreadLocal<String> id的属性. 在LoginFilter同一个位置生成一个日志id存放进去, 后面所有的日志输出的时候都把这个id加进去. 
    这种情况应该可行吧? 另外一般项目里标记日志id是怎么做的, 老师有相关文章介绍一下吗. 感激不尽! 最好能有这个Id生成的方法... 感谢
    回复 有任何疑惑可以回复我~ 2018-05-26 18:57:03
  • Jimin 回复 提问者 banjuer #2
    好想法啊,其实这个是有比较标准解决方案的,链路跟踪,具体可以参考一下google dapper,只是自己倒腾起来可能并不是那么容易。我们也是基于google dapper的思想封装了公司内部自己使用的链路跟踪组件
    回复 有任何疑惑可以回复我~ 2018-05-27 18:30:10
  • 提问者 banjuer 回复 Jimin #3
    好的, 感谢老师. 我去看看, 谢谢!
    回复 有任何疑惑可以回复我~ 2018-05-28 13:25:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信