看了一些关于IntraWeb的书,是这样描述UserSession的:可以放置一些公有数据在其中,每个用户保持数据独立。
在Delphi2007中新建一个普通(不带DataModule)的IntraWeb工程,设计了二个Form,一个叫Login,一个叫Main。通过填写用户名和密码,成功后切换到Main。这时候就要用到UserSession了,可我试了许多次,UserSession中定义的变量始终无法取得文本,也无法在任一Form中取到其值。主要代码如下(自己写的或改的语句后标有注释)://--//--UserSessionUnittype
  TIWUserSession = class(TIWUserSessionBase)
  private
    { Private declarations }
  public
    { Public declarations }
    usUser, usPass : string;  //用户名、密码
end;//--//--ServerControllerprocedure TIWServerController.IWServerControllerBaseNewSession(
  ASession: TIWApplication; var VMainForm: TIWBaseForm);
begin
  ASession.Data := TIWUserSession.Create(ASession); //原来是Create(nil)
end;//--//--IWLoginprocedure TIWfrmLogin.IWButton1Click(Sender: TObject);
//全是自己写的,调用WebService。
var
  nRet : Integer;
begin
  if Trim(IWUserId.Text) = '' then
    self.WebApplication.ShowMessage('请填写用户名!')
  else if Trim(IWPassword.Text) = '' then
    self.WebApplication.ShowMessage('请填写密码!')
  else
  begin
    nRet := GetBusinessService(true, '').validateUser(WideString(Trim(IWUserId.Text)), WideString(Trim(IWPassword.Text)));
    if nRet = 1 then
      begin
        self.WebApplication.ShowMessage('登录成功!');
        UserSession.usUser := Trim(IWUserId.Text);
        UserSession.usPass := Trim(IWPassword.Text);
        TIWfrmMain.Create(WebApplication).Show;
        self.Hide;
      end
    else
      self.WebApplication.ShowMessage('登录失败!');
      IWUserId.Clear;
      IWPassword.Clear;
      UserSession.usUser := '';
      UserSession.usPass := '';
  end;
end;procedure TIWfrmLogin.IWButton2Click(Sender: TObject);
begin
  self.WebApplication.Terminate('您退出系统了。');
end;{ 这是一个测试按钮,把它放到哪个Form上都取不到UserSession中的变量。
  procedure TIWfrmLogin.IWButton3Click(Sender: TObject);
  begin
    IWLabel3.Text := UserSession.usUser;
  end;
}//--//--ServerController
{
 Main的内容就略了,和Login的内容类似,同样需要采集公有数据。
}其它都是默认代码。我百思不解,难道是我没写UserSession的Create方法,或者没有从ServerController初始化UserSession,为什么数据写不进也读不出呢?测试按钮中的默认文本“IWLabel3”一直不变。请教各路高人!没有意义的帖诸如沙发、顶、UP之类就不劳您回了。

解决方案 »

  1.   

    目标:页面被关掉的时候,服务器的session释放。
    思路:第一步:假如页面上有个按钮,点击该按钮,session释放,这是很简单的。
         第二步:为页面的body写onunload事件,该事件调用按钮的代码。
    步骤1:在窗体上放置一个按钮IWBUTTON1,它负责释放session,代码:
          procedure TformMain.IWButton1Click(Sender: TObject);
          begin
             webapplication.Terminate();
          end;
          不要写webapplication.Terminate(字符串);这样的与句,因为
          那样将产生错误。
    步骤2:
          在窗体上放置一个IWText空间,其属性设置如下:
              rawText=true;  
              wantReturns=false;
          
          然后在IWText的lines里填写这样的代码:
              <SCRIPT FOR=window EVENT=onunload> 
                  SubmitForm.IWBUTTON1.value='hi';
                  SubmitForm.IWBUTTON1.onclick(SubmitForm.IWBUTTON1);
              </SCRIPT>
          其中的SubmitForm.IWBUTTON1.value='hi';是必须的,不可省略好了!当页面关闭时,相当于点击了那个按钮,于是服务器端的session就释放了。
    这样你就不用担心session停留时间太长了,你可以将sessiontimeout设置很长时间了,比如300
    分钟,反正只要该页面关闭,对应的session就释放。转自大富翁~~看对你有没有帮助~~
      

  2.   

    回复1楼:没帮助。session不能清除的,用来放每个用户的私人数据,也是程序的公有数据。
    回复2楼:是,没错,根据OO封装原理,应该在类的私有访问中定义数据,而在公有访问权中定义相应的property,以属性的
    形式通过读、写权限来访问成员。兹对程序作了较大改动,主要变化如下,结果UserSession中仍空空如也,求各路英雄给个解答!//--//--UserSessionUnit
     
    type
      TIWUserSession = class(TIWUserSessionBase)
      private
        { Private declarations }
        vUser: string;  //用户名、密码
        vPass: string;
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;//加入2个变量,覆盖原构造函数,OO之多态。   
        property usUser: string read vUser write vUser;  //如2楼说,这是正规且优雅的写法,OO之封装
        property usPass: string read vPass write vPass;
      end;implementation{$R *.dfm}
      uses IWInit, ServerController;constructor TIWUserSession.Create(AOwner: TComponent);  //初始创建,设置为空。
    begin
      inherited;
      vUser := '';
      vPass := '';
    end;//--//--ServerControllerprocedure TIWServerController.IWServerControllerBaseNewSession(
      ASession: TIWApplication; var VMainForm: TIWBaseForm);
    begin
      ASession.Data := TIWUserSession.Create(nil);     //不敢造次,还改回原来的nil
    end;其它unit都没动,参考了自带的示例程序Demos\IntraWeb\Win32\WebMail32