zoukankan      html  css  js  c++  java
  • datasnap 2010 加强服务程序对访问者的控制能力

    1)作为一个服务程序,如果不限制客户端访问数量,后果将是很可怕的。如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机。如何限制访问者的数量呢?

    我们可以设置一个变量,来记录来访者的数量,如果超过我们既定的数字,那么后续的连接服务器请求,都将被断掉。

    2)限制了访问数量,但是如果不做密码身份认证,无关的人员也将能登陆服务器!解决办法是客户端传入用户名和密码,如果用户名和密码不正确,连接将被挂断。

    在客户端的SQLConnection1中driver分类的username和password属性设置好用户名和密码。

    3)尽量不要设置DSTCPServerTransport1的Maxthreads属性,还有数据库连接池也不要设置,delphi2010会有内存泄露,这两个参数保存默认即可。

    在dsserver1控件的onconnect事件中加入如下代码(使用的是tcp/ip连接):

    procedure TMainForm.DSServer1Connect
      (DSConnectEventObject: TDSConnectEventObject);
    var
      val: TCP_KeepAlive;
      Ret: Integer;
      ClientConnection: TIdTCPConnection;
    begin
      // 最大连接数量,验证来访者密码
      if (DSConnectEventObject.ChannelInfo = nil) or (Connections >= 500) or
        (DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName]
          <> 'sunstone') or (DSConnectEventObject.ConnectProperties
          [TDBXPropertyNames.Password] <> 'mypassword') then
      begin
        DSConnectEventObject.DbxConnection.Destroy;
        // ClientConnection.Disconnect;
      end
      else
      begin
        // 获取socket连接
        ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
        ClientConnection.OnDisconnected := ClientDisconnectEvent;

        // 记录来访者数量
        inc(Connections);
        lblShowConnections.Caption := IntToStr(Connections);

        if Trim(ShowConnections.Cells[0, 1]) <> '' then
          ShowConnections.RowCount := ShowConnections.RowCount + 1;

        ShowConnections.Cells[0, ShowConnections.RowCount - 1] := IntToStr
          (DSConnectEventObject.ChannelInfo.Id);
        ShowConnections.Cells[1, ShowConnections.RowCount - 1] :=
          ClientConnection.Socket.Binding.PeerIP + ':' + IntToStr
          (ClientConnection.Socket.Binding.PeerPort);
        ShowConnections.Cells[2, ShowConnections.RowCount - 1] :=
          DSConnectEventObject.ConnectProperties[TDBXPropertyNames.UserName];
        ShowConnections.Cells[3, ShowConnections.RowCount - 1] :=
          DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];
        ShowConnections.Cells[4, ShowConnections.RowCount - 1] := FormatDateTime
          ('yyyy-mm-dd hh:nn:ss', Now);
        // ShowConnections.Cells[6, ShowConnections.RowCount - 1] :=
        // DSConnectEventObject.ConnectProperties
        // [TDBXPropertyNames.ServerConnection];

        // 设置心跳包
        val.OnOff := 1;
        val.KeepAliveTime := 5000;
        val.KeepAliveInterval := 1000;
        WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
          @val, SizeOf(val), nil, 0, @Ret, nil, nil);
      end;
    end;

    附加一个客户端登录需要用户名+密码验证的代码:

    Delphi2009开始,以DataSnap的JSON开发三层受用户的关注,以下是开发过程中用到的一些内容
    在客户端我们用 SQLConnection连接服务端,在登录时要验证用户及密码是否正确,本例我们用tcp/ip方式通讯,
    当然如果用http协议则把第38行放开即可。所有的验证都在服务端执行。以下为当登录一客户端时,服务端上会显示它的相关信息,当客户端退出时会删除它的相关信息的图示:


    这些功能的代码主要写在服务端的DSServer1.OnConnect和OnDisConnect事件中,但要加入以下单元:
    DBXCommon和IdTCPConnection。
    以下为代码图示:

    为了显示,所以把版面变了一下,44行消去的部分是客户端的用户名验证部分,这里大家 可以结合数据库来验证。还有一个的重点是得到客户端的IP和Port,则我们可以用TidConnection(DSConnectEventObject.ChannelInfo.id).Socket.Binding..得到,那个id是内部标识号
    得到客户的用户名和密码则是DSConnectEventObject.ConnecProperties[TDBXPropertyNames..]得到,如何防止客户端非正常退出可用心跳包来处理。

  • 相关阅读:
    Div+CSS+JQuery实现选项卡,即通过点击不同的li跳转到不同的div中显示不同的内容或者执行不同的操作。
    js如何获取点击<li>标签里的内容值
    python requests库爬取网页小实例:ip地址查询
    python requests库爬取网页小实例:爬取网页图片
    python requests库网页爬取小实例:百度/360搜索关键词提交
    python requests库网页爬取小实例:亚马逊商品页面的爬取
    python使用requests库爬取网页的小实例:爬取京东网页
    hibernate 的入门
    html
    事务的入门(mysql)
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940931.html
Copyright © 2011-2022 走看看