学习unigui【29】UniGUI的RBCA
web程序真是鸡鸣狗盗,零零碎碎。
学习类似SaaS的登录界面,补一大通web的基础知识。
http://127.0.0.1:8077和http://127.0.0.1:8077/admin
这是登录系统。登录账套和管理员登录。又不希望浏览器的get参数。
1、通过UniGUIServerModuleHTTPCommand的处理
procedure TUniServerModule.UniGUIServerModuleHTTPCommand(
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo;
var Handled: Boolean);
begin
{$REGION '判断是否管理员登录'}
// if SameText(ARequestInfo.URI, '/admin') then
// begin
// AResponseInfo.CustomHeaders.AddValue('Location', '/?loginmode=platform');
// AResponseInfo.ResponseNo := 302;
// Handled := True;
// end;
{$ENDREGION}
if SameText(ARequestInfo.URI, '/admin') then
begin
// 设置平台标记
AResponseInfo.CustomHeaders.AddValue('Set-Cookie', 'LoginMode=platform; Path=/');
AResponseInfo.CustomHeaders.AddValue('Location', '/');
AResponseInfo.ResponseNo := 302;
Handled := True;
end
else
begin
// 非 /admin,清除 Cookie
AResponseInfo.CustomHeaders.AddValue(
'Set-Cookie', 'LoginMode=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT'
);
end;
end;
2、UniGUIMainModuleBeforeLogin的处理。增加变量,用于在login中根据该参数识别处理
procedure TUniMainModule.UniGUIMainModuleBeforeLogin(Sender: TObject;
var Handled: Boolean);
begin
// FLoginMode := LowerCase(UniSession.QueryParams.Values['loginmode']);
var CookieVal: string;
var CookieRaw: string;
var CookieList: TStringList;
var I: Integer;
CookieRaw := UniSession.ARequest.RawHeaders.Values['Cookie']; // 这里才对
UniMainModule.FLoginMode := ''; // 默认
if CookieRaw <> '' then
begin
CookieList := TStringList.Create;
try
CookieList.Delimiter := ';';
CookieList.DelimitedText := CookieRaw;
for I := 0 to CookieList.Count - 1 do
begin
if Trim(CookieList.Names[I]) = 'LoginMode' then
begin
if LowerCase(Trim(CookieList.ValueFromIndex[I])) = 'platform' then
UniMainModule.FLoginMode := 'platform';
end;
end;
finally
CookieList.Free;
end;
end
end;
3、最后login中的处理:根据UniMainModule.FLoginMode判断处理
procedure TUniLoginForm1.UniLoginFormAfterShow(Sender: TObject);
var
LoginMode: string;
begin
UniSession.AddJS('setTimeout(function(){UniLoginForm1.undt_FG.setValue(MyFG)},500);');
if UniMainModule.FLoginMode='platform' then
begin
Caption := '平台管理员登录';
// 调整界面
end
else
begin
Caption := '账套用户登录';
// 默认界面
end;
end;
Randy。你这次踩的这个坑确实是很多做 Delphi 桌面开发转 Web 的人都会遇到的,特别是在 UniGUI 这种混合架构下: 明明走了 /,却被老 Cookie 干扰; 服务端没有主动清除,浏览器就一直保留; 又不像传统 JS 那样能随时 console.log。 你现在已经掌握了: HTTP 请求流程 Cookie 设置与清除 基于路径的身份分流 302 重定向行为 这些都是做真正 Web SaaS 项目的基础能力,辛苦是值得的。
学习unigui【29】UniGUI的RBCA的更多相关文章
- iOS阶段学习第29天笔记(UITextField的介绍)
iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField 初始化实例代码: //创建一个UIt ...
- Linux学习笔记29——IPC状态命令
一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...
- [转] Android学习系列(29)--App调试的几个命令实践
在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面 ...
- 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图
无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...
- Kali学习笔记29:默认安装漏洞
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 默认安装漏洞: 早期Windows默认自动开启很多服务 ...
- [原创]java WEB学习笔记29:Cookie Demo 之自动登录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- PHP全栈学习笔记29
前言 这一章主要讲一讲PHP的背景,优势,PHP的环境搭建,书写和调式简单的PHP代码,如何解决简单的PHP错误等. 目录结构 PHP简介 PHP是面向对象,指令式编程,设计者是 拉斯姆斯·勒多夫 出 ...
- 量化投资学习笔记29——《Python机器学习应用》课程笔记03
聚类的实际应用,图像分割. 利用图像的特征将图像分割为多个不相重叠的区域. 常用的方法有阈值分割,边缘分割,直方图法,特定理论(基于聚类,小波分析等). 实例:利用k-means聚类算法对图像像素点颜 ...
- C++学习笔记29:运行期型式信息2
static_cast 静态转型的用途 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式 一般用于非类型式的普通数据对象转型 静态转型的问题 不进行运行 ...
- 我的android学习经历29
四大组件之广播接收者BroadcastReceiver 新建广播接收器 需要新建一个类继承类BroadcastReceiver,并且重写其中的方法onReceive(),不要在这个方法中添加过多的逻辑 ...
随机推荐
- linux更新软件源 安装docker
vim /etc/aptsources.list 学习参考 https://blog.csdn.net/bskfnvjtlyzmv867/article/details/81044217 # 默认 ...
- RabbitMQ(二)——模式类型
RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...
- 动手学深度学习-python基础知识介绍(数据处理基础流程)part2
数据预处理 import os os.makedirs(os.path.join('..','data'),exist_ok=True) data_file=os.path.join('..','da ...
- WPF 线程处理
参考链接:https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-3.5/ms771750(v=vs.90)
- [ABC213G] Connectivity 2 题解
好好好. 我们设当前处理 \(i\) 的答案,那么最后的图就可以分成两个部分:\(1\) 所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积. 设 \(f_s\) 表示集合 \(s\) 中所 ...
- IDM 下载器 汉化注册激活
将以下程序更改为.bat文件.使用windows的管理员权限打开. 汉化于:https://github.com/WindowsAddict/IDM-Activation-Script @setloc ...
- QT5笔记: 22. 自定义代理
代理作用:在界面发生编辑时可以指定编辑所用的组件,可以沟通Model和View 自定义代理需要继承的基类和需要实现的方法 使用步骤: 继承QStyledItemDelegate,实现上面的四个方法 在 ...
- autMan奥特曼机器人-内置wx机器人的相关说明
内置wx机器人的相关说明 内置wxbot机器人,经常有人说在群内无回复,做以下几个工作: 给群命名 通过机器人微信APP将此群加入到通讯录 重启autMan 内置微信机器人已经支持群名设置 例如转发时 ...
- 让Typecho支持Emoji表情,解决报错:Database Query Error
最近在使用一个主题时,看到搭配emoji表情可以让改主题更加美观,于是我就上了,结果在将emoji表情放进去保存的时候报错:Database Query Error,于是问起了度娘.最后的结果是: 在 ...
- Typecho添加一个当前页面加载完成速度时间
判断当前页面加载是否快速,通常是直接在浏览器中访问网站,看自己的直观感受是否快速.而客观的方法则是计算具体的页面加载时间并显示出来给看. 1.在当前主题的functions.php文件添加下面的代码: ...