LuCI用来做openwrt的页面的,不同于常见的html+css+javascript,openwrt是用lua脚本语言开发的。
MVC框架model+view+controller的简写。openwrt将实现不同功能的lua脚本放在不同的文件夹中。
什么是controller控制器?
设置功能在页面的位置,同时设置点击页面后,将要调用的功能是去model模型读写配置数据还是要呈现一个静态页面,或者执行lua脚本函数。
什么是model模型?
通过cbi模块和UCI(同一配置接口)进行交互,将页面和路由器的配置关联起来,从而将页面的配置写到路由器当中。
什么是view试图?
呈现页面的样式
注:公司LUCi的TDwifisetting的lua模块的源程序在/package/bcmwlconf/files/里面
1、登录web页面时的数据交互
(1)、首次运行时,以普通的file方式得到docroot(www)/index.html文件,该文件以mate方式自动跳转到/cgi的url(/www/cgi-bin/luci),这是一般服务器的做法。
/www/index.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" />
<meta http-equiv="cache-control" content="no-cache">
</head>
</html>
标红注解:refresh--自动刷新并指向新页面 content--停留几秒钟后刷新到URL网址
URL--新页面网址
(2)、第一次执行luci(/www/cgi-bin/luci)时,path_info = '/',会alise到"admin",因为'/'会索引tree.rootnode,并执行其target方法(alise("admin")),所以去所以adminnode,该节点需要认证,所以返回登录页面,后面详登录认证过程。(有密码的情况,下同)
(3)、第三次交互时,已经post来登录信息,此时srv会生成一个sessecion值,然后执行'admin'的target方法,admin方法为firstchild(),返回admin页面。同时把sessection值以cookie的形式返回给client,这是从原始状态到显示主页面的过程,后面这是点击页面请求产生新的request。
(4)、每个链接中的URL中都带有stok值(由srv生成,放在html的url中),每个新的request都要带有stok(sessection),由srv联合认证。如下图所示,带有正确的stok的url则无需再认证,表示在有效期内用户是登录状态,无需在输入密码。
后台是如何记录不同登录用户的stok呢?
在路由器/tmp/luci-sessions/目录下已stok为名字的文件并保存该stok对应的用户登录的在线时间等信息。所有这个功能可用用来限制用户的登录时间与同时在线的用户个数,这就是为什么只有有密码的用户才有在线的概念。而保存stok的文件由dispatcher.lua中的diapatch函数调用sauth.lua实现的wirte函数写入的,主要代码如下:
sauth.write(token, {
user=user,
ltype=ltype,
token=token,
secret=luci.sys.uniqueid(16)
})
文章有部分借鉴网上资料,暂时先写这么多,如有错误或者侵权请指正,谢谢