天天看点

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

作者:丰行果园

在asp.net mvc中的我们经常用到的ActionFilterAttribute做请求拦截,而且也非常好用,那么在我们的框架中怎么自己实现拦截器功能呢?

其实实现的思路也很简单,在上一篇文章,我们介绍利用反射技术调用Controller里的Action(方法)拦截器就是在Action调用前,对请求做验证,满足条件才正式调用Action,否则终止程序。拦截器要实现一个验证方法,返回FilterResult对象,如果结果是Passed认为验证通过,则继续调用Action,否则不调用。

下面来看具体实现代码,首先定义FilterResultType枚举和FilterResult类

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

代码很简单,不需要解释吧。

接着编写IActionFilter接口ActionFilterAttribute类

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现
「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

BeforeInvoke方法接受三个参数context,controller,action,context是请求的上下文对象,controller是被请求的Controller对象,action就是具体的方法。这是一个虚方法,具体要看继承类型的实现。ActionFilterAttribute的应用目标是类和方法,所以可以对某个Action做拦截,也可以对整个Controller(模块)做拦截。

好了,拦截器的根基已经打好了,下面我们来做一个具体的拦截器,来拦截未登录用户的请求,取个名字吧RequiredLoginAttribute

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

在RequiredLoginAttribute中我们简单判断context.CurrentUser对象,不为null则表示已登录返回PassedResult,否则为未登录,返回RedirectResult重定向结果,程序将被重定向到views/login.html页面让登录。

下面贴User类和App类的代码

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现
「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

到这里,用户拦截器就完成了!但是拦截器要怎么发挥作用呢?在前面的文章,我们知道Action的调用是由Controller的InvokeAction方法执行的,所以,拦截器要发挥作用也应该在那里。

在修改InvokeAction之前,我们先给Action添加上RequiredLoginAttribute。在XUI.App中新建Controllers目录,在此目录下新建一个Controller,IndexController,里边有一个Action名字为Dashboard,给他应用上RequiredLoginAttribute,代码如下

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

再新建一个LoginController,不应用RequiredLoginAttribute

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

由代码可见,当验证用户名和密码成功后,我们给AppContext.Instance.CurrentUser赋值(此处AppContext为App别名)

再在views目录里创建两个View:dashboard.html和login.html

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现
「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

好了,我们来修改InvokeAction方法

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

红色方框中,我们分别读取Controller和Action上的ActionFilterAttribute,此时读取到的对应的实例应该是RequiredLoginAttribute类型,调用实例的BeforeInvoke方法,BeforeInvoke返回FilterResult对象,表示验证的结果。如果FilterResult的Type不是Passed,则InvokeAction直接return此FilterResult,那么后边的真正调用Action的代码就不会被执行了,所以能起到拦截的作用。

CustomWebView2.Native.SolveMessage方法再做下调整

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

修改Form1.cs,将首次加载页改为views/dashboard.html

「WebView2实践」开发桌面开发框架之拦截器ActionFilter实现

这样,程序一运行,就会加载dashborad.html,此时会进行拦截验证,接着会跳转到login.html做登录,登录完成后再进入dashborad.html页就正常显示了。

演示视频

视频加载中...

继续阅读