分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程CGI专区 → 文章内容

在CGI中实现session的想法和实现

  • 作者:无从考证    来源:CSDN    发布时间:2005-9-15 11:25:25
  • 字体大小:
 session_id = cgi_val(entries,"session_id");
/**
  * open session file
  */
   strcpy(sfp,"/tmp"); 
   strcat(sfp,"/sess_");
   strcat(sfp,session_id);
   sf = fopen(sfp,"rb+");
   if(  sf == NULL )
            /** can’t open session file,maybe session has time out **/ 
   {
       print_session_error("1");
       exit(1);
   }
/**
  * read session var
  */
  bzero(buffer,256);
  fread(buffer,1,256,sf);
  for(i=0,j=0,k=0;k<5 && i<strlen(buffer);i++)
  {
     if( buffer[i] == ’\n’  )
     {
        temp[j] = ’\0’;
        strcpy(str_array[k],temp);
        j = 0;
        k ++;
     }
     else
     {
       temp[j++] = buffer[i];
     }
  }
/**
  * check active time
  */ 
  time(&now);
  if( now - atoi(str_time) > atoi(parse_config_file("session_live_time")) )
  {
     print_session_error("2"); 
     exit(1);
  } 
/**
  * compare client hash_key to session hash_key
  */
  if( HTTP_COOKIE == "" || strcmp( HTTP_COOKIE+9 , str_hash_key ) != 0 )
  {
     print_session_error("3");
     exit(1);
  } 
/**
  * compare client ip to session ip
  */
  if( strcmp( REMOTE_ADDR, str_client_ip ) != 0 )
  {
     print_session_error("4");
     exit(1);
  }
/**  
  * refresh session active time
  */ 
  time(&now);
  sprintf(str_time,"%10d\n",now);
  fseek(sf,0,SEEK_SET);
  fputs(str_time,sf);  
/**
  * get new hash_key
  */
  srand(now);
  r = rand();
  for(i=0;i<16;i++)
  {
     srand(r);
     r = rand();
     str_hash_key[i] = r % 26 + ’a’;
  }
  str_hash_key[16] = ’\n’;
  str_hash_key[17] = ’\0’;
 
/**
  * refresh session hash_key
  */
  fseek(sf,11,SEEK_SET);
  fputs(str_hash_key,sf);
  fclose(sf);
/**  
  * send cookie refresh client hash_key
  */
  printf("Set-Cookie:hash_key=%s",str_hash_key);  
}
void kill_session()
{
  char *session_id;
  char *session_path;
  char sfp[128];
  session_id   = cgi_val(entries,"session_id");
  strcpy(sfp,"/tmp"); 
  strcat(sfp,"/sess_");
  strcat(sfp,session_id);
  remove(sfp);
}
void clean_session_file()
{
  DIR *pdir;
  struct dirent *ent;
  char *path;
  char *filename;
  char filepath[64];
  int fd;
  char str_time[11];
  time_t  now;
  path = "/tmp";
  pdir = opendir(path);
  if(pdir != NULL)
  {
    while( ent =readdir(pdir) )
    {
       filename = ent->d_name; 
       if( strncmp(filename,"sess_",5)==0 )
       {
          strcpy(filepath,path);
          strcat(filepath,"/");
          strcat(filepath,filename);
          fd = open(filepath,O_RDONLY);
          read(fd,str_time,10);
          time(&now);
          if( now - atoi(str_time) > atoi(parse_config_file("session_live_time")) ) 
          {
            remove(filepath);
          } 
          close(fd);
       }
    } 
  }
  closedir(pdir);
}
void print_session_error(char *n)
{
   printf("Content-type:text/html\n\n");
   printf("<html><head>";
   print_title("请重新登陆!");
   printf("</head>\n");
   printf("<body>\n");
   printf("对不起,请重新登陆。<p>\n");
   printf("你长时间没有操作,登陆已经超时。或者是系统发生了错误。<p>\n");
   printf("如果是后者,请与管理人员联系。\n");
   printf("<!--%s-->",n);
   printf("</body>");
   printf("</html>\n");

上一页  [1] [2]