meituan/WMRouter

关于登录拦截器的问题

Closed this issue · 2 comments

我们现在有很多业务逻辑有登录判断。比如一个Activity是不需要登录就能进入,但是其中的某些方法是需要判断登录状态的:只有登录的才能执行,否则跳转到登录页面,登录成功之后返回原始页面继续执行该方法。
本来打算使用wmrouter的拦截器,但是发现拦截器只能用到类的注解上面,并不支持在方法上面进行注解。请问这种业务逻辑,WMRouter有没有什么比较好的方案能够解决?或者作者有没有什么好的思路?
非常感谢!

WMRouter拦截器只用于页面跳转的场景,不需要跳转页面的情况没法处理。

下面是参考解决方法。

实现一个用户登录的观察者,然后写一个工具类简单示例如下。

class LoginUtils {
	static void loginAndRun(Runnable loginAction) {
		if (UserManager.isLogin()) {
			loginAction.run();
		} else {
			UserManager.registerObserver(new Observer() {
				void onLogin() {
					try {
						loginAction.run();
					} catch (Exception e) {
					}
					UserManager.unregisterObserver(this);
				}

				void onCancel() {
					UserManager.unregisterObserver(this);
				}
			});
			UserManager.login();
		}
	}
}

修改需要登录执行的方法:

void someMethod() {
	// 需要登录执行的代码
	xxx();	
}

改为

void someMethod() {
	UserManager.loginAndRun(new Runnable() {
		void run() {
			// 需要登录执行的代码
			xxx();
		}
	});
}

上述实现有个问题,调起登录Activity后,如果出现内存不足的情况,前一个Activity被销毁,就会导致loginAction没法正确执行,不过发生的几率不大。

如果这种场景比较多,想更自动化一点,可以利用AspectJ结合注解,在编译期间自动完成上述的替换过程(但是会影响编译速度)。

YPB123 commented

可以自己引入自定义的协议。假如跳转账户页: link://app.com/user/account
你继承 UriHandler 自定义一个 AccountHandler,使用注解
@RouterUri(scheme = link, host = app.com, path = ["/user/account"] interceptors = [LoginInterceptor.class])
这个Handler里增加跳转用户页的逻辑就好了。

按钮中使用 Router.startUri("link://app.com/user/account")就ok了。

这样写好处是 增强一致性,保留跨模块的特性,保持业务方 和 服务方逻辑的完全隔离。