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的更多相关文章

  1. iOS阶段学习第29天笔记(UITextField的介绍)

    iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField  初始化实例代码: //创建一个UIt ...

  2. Linux学习笔记29——IPC状态命令

    一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...

  3. [转] Android学习系列(29)--App调试的几个命令实践

    在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面 ...

  4. 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图

    无论学习.只看不练是坏科学. 因此,要总结回想这怎么生产MMROPG小地图的游戏.于MMROPG游戏类,在游戏世界中行走时导致各地,通常在屏幕的右上角,将有一个区域,以显示当前的游戏场景微缩.在游戏世 ...

  5. Kali学习笔记29:默认安装漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 默认安装漏洞: 早期Windows默认自动开启很多服务 ...

  6. [原创]java WEB学习笔记29:Cookie Demo 之自动登录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. PHP全栈学习笔记29

    前言 这一章主要讲一讲PHP的背景,优势,PHP的环境搭建,书写和调式简单的PHP代码,如何解决简单的PHP错误等. 目录结构 PHP简介 PHP是面向对象,指令式编程,设计者是 拉斯姆斯·勒多夫 出 ...

  8. 量化投资学习笔记29——《Python机器学习应用》课程笔记03

    聚类的实际应用,图像分割. 利用图像的特征将图像分割为多个不相重叠的区域. 常用的方法有阈值分割,边缘分割,直方图法,特定理论(基于聚类,小波分析等). 实例:利用k-means聚类算法对图像像素点颜 ...

  9. C++学习笔记29:运行期型式信息2

    static_cast 静态转型的用途 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式 一般用于非类型式的普通数据对象转型 静态转型的问题 不进行运行 ...

  10. 我的android学习经历29

    四大组件之广播接收者BroadcastReceiver 新建广播接收器 需要新建一个类继承类BroadcastReceiver,并且重写其中的方法onReceive(),不要在这个方法中添加过多的逻辑 ...

随机推荐

  1. 浏览器自动化与AI Agent结合项目browser-use初探

    browser-use介绍 browser-use是将您的 AI 代理连接到浏览器的最简单方式.它通过提供一个强大且简单的接口来实现 AI 代理访问网站的自动化. GitHub地址:https://g ...

  2. mac环境下配置jdk

    1.如果你是第一次配置环境变量,可以使用"touch .bash_profile" 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用&quo ...

  3. .NET Core 托管堆内存泄露/CPU异常的常见思路

    常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root ...

  4. ML树构建简明教程

    数据准备 Teamviewer登录实验室服务器,访问http://172.17.128.86:8501/CleanData,按照页面对应的格式要求分别从NCBI和GISAID数据库下载数据,拖拽到对应 ...

  5. 全源最短路——Johnson 算法

    一.问题引入 目前我们所知道的一些常见的最短路算法有 dijkstra.spfa.floyd. dijkstra 和 spfa 是单源最短路,floyd 是多源最短路. 如果我们需要在 \(O(nm) ...

  6. hgame2025-Crypto小记

    hgame2025-Crypto小记 发现积压在文件夹有一段时间了.整理一下发出来. suprimeRSA task.py from Crypto.Util.number import * impor ...

  7. 运算符“<”不能应用于类型“boolean”和“RegExp”。ts-plugin(2365)

    在使用vue3 + setup + ts + volar插件开发时,遇到文件全红报这个错,尝试很多方法没有效果,最后把vscode插件全部卸载,然后重新安装就好了,如果有遇到此问题的可以尝试同样的方法 ...

  8. PIL或Pillow学习1

    PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以来,由于 PIL 库更新缓慢,目前仅支 ...

  9. 【UWB】DWM1000 室内定位串口协议说明

    UWB室内定位串口协议说明 通过串口发送的测距报告消息有三种: "mr"信息包括标签到锚定原始范围 "mc"标签到锚定范围偏差修正范围 - 用于标签位置 &qu ...

  10. Vscode写Markdown解决图片使用问题

      最近使用Vscode+Markdown写博客,图片不好弄,想了一下办法,有需要的人可以参考,有更方便的方法欢迎提出!   首先为了解决图片粘贴问题,下载一个扩展,Markdown Paste,下载 ...