单点登录是经常在系统集成中要使用的一种技术,其目的是减少用户在系统间跳转时的频繁登录操作;使多个系统使用起来更像是一个系统;
单点登录一般都使用Url查询参数的方式实现,例如:
http://localhost/?name=1111&password=2333Pascal需要UniGui来进行解析;一般在UniMainModule中的UniGUIMainModuleBeforeLogin中进行处理;
//如何获取查询参数;
//假如请求URL为 http://localhost/?name=1111&password=2333
procedure TUniMainModule.UniGUIMainModuleBeforeLogin(Sender: TObject;
var Handled: Boolean);
begin
with (Sender as TUniGUISession).UniApplication.Parameters do
begin
//获取请求参数 - name
Values['name'];
//获取请求参数 - password
Values['password'];
end;
//这里进行账户验证、权限赋予等操作
......
//不进行登录;如果验证失败,这个地方就填 False
Handled := True;
end;Pascal以上处理后,已经可以绕开登录界面正常进入主页了;但是这个时候另外一个问题来了,浏览器的URL中有用户名和参数;

这样明目张胆的显示在这里,显然是不好的;另外实际应用中,必须对敏感信息进行加密处理~~!
下面增加了不刷新页面去除请求参数的代码,比较简单
//如何获取查询参数;
//假如请求URL为 http://localhost/?name=1111&password=2333
procedure TUniMainModule.UniGUIMainModuleBeforeLogin(Sender: TObject;
var Handled: Boolean);
begin
with (Sender as TUniGUISession).UniApplication.Parameters do
begin
//获取请求参数 - name
Values['name'];
//获取请求参数 - password
Values['password'];
end;
//这里进行账户验证、权限赋予等操作
......
//不刷新页面;去除实际的请求参数
//参数1:状态对象,可存储页面相关数据(通常传空对象) 默认{}就可以了
//参数2:标题(现代浏览器忽略此参数) 默认""就可以了
//参数3:新URL(必须同源) 这个地方需要随便填点东西,但是不能为"";如果填空,原本的参数不变
UniSession.AddJS('window.history.pushState({}, "", "?Local")');
//不进行登录;如果验证失败,这个地方就填 False
Handled := True;
end;Pascal