DataSnap 怎么样验证客户端js验证用户名和密码码

作为一个服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。有了客户端IP就能随心所欲操控客户端,比如终止某些客户端的连接、限制功能等等。
在delphi2010中的datasnap服务器如何获得客户端ip,的确花了我点时间,奇怪为什么这个功能不做的更人性化点呢,功能总是藏着掖着。还得让程序员像寻宝一样摸索,浪费时间。现在把我整理的结果奉献给大家,免得大家在花时间研究这个。
另外,通过研究发现,DSConnectEventObject.ChannelInfo.Id 属性实际上是内存地址,并不是一个简单的数字。
以下代码红色部分是关键。
uses IdTCPConnection;
procedure TServerContainer1.DSServer1Connect& (DSConnectEventObject: TDSConnectEventObject);var& ClientConnection: TIdTCPCbegin& with Form1 do& begin&&& dsShowDataSet.A&&& dsShowDataSet['ClientConnectTime'] := N
&&& if DSConnectEventObject.ChannelInfo && nil then&&& begin&&&&& ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
&&&&& dsShowDataSet['ClientID'] := DSConnectEventObject.ChannelInfo.Id;&&&&& dsShowDataSet['ClientIP'] := ClientConnection.Socket.Binding.PeerIP +&&&&&&& ':' + IntToStr(ClientConnection.Socket.Binding.PeerPort);&&&&& dsShowDataSet['ServerIP'] := ClientConnection.Socket.Binding.IP + ':' +&&&&&&& IntToStr(ClientConnection.Socket.Binding.Port);&&&
&&& dsShowDataSet['ClientUserName'] := DSConnectEventObject.ConnectProperties&&&&& [TDBXPropertyNames.UserName];&&& dsShowDataSet['ClientUserPassword'] :=&&&&& DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];&&& dsShowDataSet['ServerInfo'] := DSConnectEventObject.ConnectProperties&&&&& [TDBXPropertyNames.ServerConnection];&&& dsShowDataSet.P&
阅读(...) 评论()查看: 19614|回复: 61
Delphi XE7开发的DataSnap服务端和客户端程序
主题帖子积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
Delphi XE7&
网络&图形&
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
(1.19 MB, 下载次数: 9582)
20:19 上传
点击文件名下载附件
3.png (32.29 KB, 下载次数: 683)
20:20 上传
2.png (29 KB, 下载次数: 605)
20:20 上传
1.png (21.87 KB, 下载次数: 623)
20:20 上传
本文章介绍了Delphi XE7开发的DataSnap服务端和客户端程序,经过几天对datasnap进行了学习,写了一个服务端程序以及一个客户端调用程序,在服务端中,添加了下面两个主要函数
& & [TRoleAuth('admins')]function RunSQL(SQLStr:Sout OutDataSet: OleVOut ErrorStr:String):B
& & [TRoleAuth('admins')]function ExecSQL(SQLStr:SOut ErrorStr:String):B复制代码
然后客户端进行了调用
procedure TDataSnapClient.ExecSQL(SQLStr: String);
begin
&&if FRunSQLMethodCommand = nil then
&&begin
& & FRunSQLMethodCommand := FDBXConnection.CreateC
& & FRunSQLMethodCommand.CommandType := TDBXCommandTypes.DSServerM
& & FRunSQLMethodCommand.Text := 'TParametersServerModule1.ExecSQL';
& & FRunSQLMethodCommand.P
&&
&&FRunSQLMethodCommand.Parameters[0].Value.SetWideString(SQLStr);
&&FRunSQLMethodCommand.ExecuteU
function TDataSnapClient.RunSQL(SQLStr:String):OleV
begin
&&if FRunSQLMethodCommand = nil then
&&begin
& & FRunSQLMethodCommand := FDBXConnection.CreateC
& & FRunSQLMethodCommand.CommandType := TDBXCommandTypes.DSServerM
& & FRunSQLMethodCommand.Text := 'TParametersServerModule1.RunSQL';
& & FRunSQLMethodCommand.P
&&
&&FRunSQLMethodCommand.Parameters[0].Value.SetWideString(SQLStr);
&&FRunSQLMethodCommand.ExecuteQ
&&Result:=FRunSQLMethodCommand.Parameters[1].Value.AsV
该服务端程序进行了服务账号密码、数据库的配置等参数的配置。有兴趣的可以下载来看看。
转载请保留当前帖子的链接: 谢谢!
搜索简单,分享不易,且分享且珍惜,您难道不想分享下您的心得?如果觉得本文章好的话,您可以在我们网站上注册,然后发布您的好的心得,让大家共同进步,谢谢!
主题帖子积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
客户端为啥执行到以下就地址错误(跟踪服务端正常)。&&
ClientDataSet2.Data:=ReturnDataS& &...
你可以把这个对象的值保存到一个文件中,看是否有数据
主题帖子积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
因为delphi xe7的数据库连接池以及连接池都进行了集成,所以开发很简单,而且客户端一般数据库应用最多的就是runsql以及executesql,所以在服务端主要就是实现了这两个函数,客户端进行数据查询,直接使用这两个函数即可。如果需要其他功能,可以在这两个函数上面进行集成,例如执行sql 列表,查最大值最小值等。后续我会对功能进行细化。
而且datasnap可以在移动上面进行使用,使用这个,对于移动开发来说只需要一个ip连接到服务器,和pc端一样简单。
参考了,多谢
主题帖子积分
新手上路, 积分 10, 距离下一级还需 40 积分
新手上路, 积分 10, 距离下一级还需 40 积分
好东西,拿走研究研究,感谢LZ
主题帖子积分
注册会员, 积分 67, 距离下一级还需 133 积分
注册会员, 积分 67, 距离下一级还需 133 积分
怎么用DBEXPRESS连数据库总是提示缺少驱动呀,请问还需要安装什么吗?找的这个只能试用30天.楼主有驱动共享一下吗,谢谢!
主题帖子积分
新手上路, 积分 6, 距离下一级还需 44 积分
新手上路, 积分 6, 距离下一级还需 44 积分
支持顶一下。。。。。~
主题帖子积分
新手上路, 积分 10, 距离下一级还需 40 积分
新手上路, 积分 10, 距离下一级还需 40 积分
客户端为啥执行到以下就地址错误(跟踪服务端正常)。&&
ClientDataSet2.Data:=ReturnDataS&&//地址错误
ClientDataSet2.O
主题帖子积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
论坛元老, 积分 4501, 距离下一级还需 9995498 积分
客户端为啥执行到以下就地址错误(跟踪服务端正常)。&&
ClientDataSet2.Data:=ReturnDataS& &...
没问题啊,我这里可以的呢
主题帖子积分
新手上路, 积分 37, 距离下一级还需 13 积分
新手上路, 积分 37, 距离下一级还需 13 积分
你可以把这个对象的值保存到一个文件中,看是否有数据
想咨询下Datasnap能支持多少并发呢?
是不是DIOCP下的并发更强大?
学了几天,不太明白DataSnap的优势。
Powered bydatasnap rest Windows客户端编写
时间: 22:46:04
&&&& 阅读:219
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&首先吐槽一下XE关于datasnap的资料真的是太少了。。。
服务端用DSHTTPService1控件可以实现http接口方式的调用,返回的都是json格式数据,适用于跨平台解析。
这里着重强调一下datasnap&http方式默认为Get方式调用,如果用Post方式的话需要在TServerMethods1单元方法前加update,好无语的方式。。
用Get方式这里说一下如果接口有参数的情况下,传递格式为&接口名/参数1/参数2/&&,比如:http://127.0.0.1:8080/datasnap/rest/TServerMethods1/接口名/tom/jerry。
另外如果参数里有中文的话需要对参数编码一下,用TIdURI.ParamsEncode方法即可。
客户端调用接口后,datasnap中间件返回的json数据对中文进行了编码,在客户端继续用json编码一下即可。
客户端调用例子如下:
procedure TForm2.Button1Click(Sender: TObject);
lrlt: TStringS
s,lurl: string;
jo: TJSONO
lrlt := TStringStream.Create(‘‘);
lurl := edtUrl.T
lurl := lurl + TIdURI.ParamsEncode(‘/name/啊啊啊‘);
IdHTTP1.Get(lurl,lrlt);
jo := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(lrlt.DataString),0) as TJSONO
//返回表格字段个数
i := TJSONArray(TJSONObject(TJSONArray(jo.GetValue(‘result‘)).Items[0]).GetValue(‘table‘)).C
mmLog.Lines.Add(IntToStr(i));
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/hejoy91/p/5914399.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!!!datasnap 如何监控客户端的连接情况
我的图书馆
!!datasnap 如何监控客户端的连接情况
如果客户端是TCP/IP是短连接的情况就没有必要了。
type pClientConns = ^TClientC // 客户连接 TClientConns = record clientid: ip: port: logintime: TDateT
type G_ClientConnects: TDictionary&TIdTCPConnection, pClientConns&; // 客户端连接字典
procedure TServerContainer1.DSTCPServerTransport1Connect (Event: TDSTCPConnectEventObject);var p: pClientCbegin try if G_ConnnectCount &= G_MaxConnNum then begin LogInfo('已超过系统授权的客户连接数'); TIdTCPConnection(Event.Connection).D InterlockedIncrement(G_ConnnectCount); New(p); if Assigned(p) then begin p^.clientid := Event.Channel.ChannelInfo.Id; p^.ip := Event.Channel.ChannelInfo.ClientInfo.IpA p^.port := Event.Channel.ChannelInfo.ClientInfo.ClientP p^.logintime := N G_ClientConnects.Add(TIdTCPConnection(Event.Connection), p); PostMessage(Application.MainForm.Handle, WM_ADDUSER, wParam(p), lParam(TIdTCPConnection(Event.Connection))); except
procedure TServerContainer1.DSTCPServerTransport1Disconnect (Event: TDSTCPDisconnectEventObject);var p: pClientCbegin try if G_ConnnectCount &= 1 then InterlockedDecrement(GlobalVar.G_ConnnectCount); p := G_ClientConnects.Items[TIdTCPConnection(Event.Connection)]; if Assigned(p) then begin SendMessage(Application.MainForm.Handle, WM_DELUSER, wParam(p), 0); G_ClientConnects.Remove(TIdTCPConnection(Event.Connection)); except
procedure Tf_MainForm.AddUser(var msg: TMessage);var p: pClientCbegin try Label4.Caption := IntToStr(G_ConnnectCount); p := pClientConns(msg.WParam); if Assigned(p) then begin ClientDataSet1.A ClientDataSet1.FieldByName('id').AsInteger := p^. ClientDataSet1.FieldByName('ip').AsString := p^. ClientDataSet1.FieldByName('port').AsString := p^. ClientDataSet1.FieldByName('time').AsDateTime := p^. ClientDataSet1.FieldByName('conn').AsInteger := msg.LP ClientDataSet1.P except on E: Exception do begin LogInfo('Tf_MainForm.AddUser---' + E.Message);
procedure Tf_MainForm.DelUser(var msg: TMessage);var p: pClientCbegin try Label4.Caption := IntToStr(G_ConnnectCount); p := pClientConns(msg.WParam); if Assigned(p) then begin if ClientDataSet1.FindKey([p^.clientid]) then ClientDataSet1.D Dispose(p); except on E: Exception do begin LogInfo('Tf_MainForm.DelUser---' + E.Message);
上一篇: 下一篇:
阅读(2322) 评论(1)
谢谢提供的思路,不过该代码存在一定的问题,1、DSTCPServerTransport1Connect 这个方法先判断是否超出授权,如果超出的话断开连接,会执行 DSTCPServerTransport1Disconnect 事件,事件中的InterlockedDecrement(GlobalVar.G_ConnnectCount); 会造成 在线数数量统计不正确的问题;2、在DSTCPServerTransport1Disconnect 事件中,G_ClientConnects.Remove(TIdTCPConnection(Event.Connection));后没有释放 G_ClientConnects 列表中分配的内存,造成内存泄露。应该在后面加上 dispose(p);以下是开改造后的代码,有问题可以继续讨论。procedure TServerContainer.DSTCPServerTransport1Connect( Event: TDSTCPConnectEventObject);var sip, sport: id: NativeIvar p: pClientCbegin try InterlockedIncrement(G_ConnnectCount); New(p); if Assigned(p) then begin p^.clientid := Event.Channel.ChannelInfo.Id; p^.ip := Event.Channel.ChannelInfo.ClientInfo.IpA p^.port := Event.Channel.ChannelInfo.ClientInfo.ClientP p^.logintime := N G_ClientConnects.Add(TIdTCPConnection(Event.Connection), p); //PostMessage(Application.MainForm.Handle, WM_ADDUSER, wParam(p), //lParam(TIdTCPConnection(Event.Connection))); if G_ConnnectCount & G_MaxConnNum then begin LogInfo('已超过系统授权的客户连接数'); TIdTCPConnection(Event.Connection).D exceptprocedure TServerContainer.DSTCPServerTransport1Disconnect( Event: TDSTCPDisconnectEventObject);var sip,sport: conne:TIdTCPCvar p: pClientCbegin try if G_ConnnectCount &= 1 then InterlockedDecrement(G_ConnnectCount); p := G_ClientConnects.Items[TIdTCPConnection(Event.Connection)]; if Assigned(p) then begin G_ClientConnects.Remove(TIdTCPConnection(Event.Connection)); Dispose(p); except
喜欢该文的人也喜欢简单的datasnap三层,【服务器】怎么获取【连接客户端】的【计算机名】
我的图书馆
简单的datasnap三层,【服务器】怎么获取【连接客户端】的【计算机名】
简单的datasnap三层,【服务器】如何获取【连接客户端】的【计算机名】?新手求教~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~------解决思路----------------------客户端连接服务器成功后,向服务器发送消息:
DataModule1.SocketConnection1.AppServer.ClientOnOut(aPCName,aIP,'','上线&&&&','IN');
喜欢该文的人也喜欢

我要回帖

更多关于 jsp验证用户名和密码 的文章

 

随机推荐