始建属于其余Session的历程

 
创建其他Session(User)的进程需要拿到对应Session的Token作为CreateProcessAsUser的参数来启动进程。 

Sessions:A session is a collection of one or more process groups.

问:浏览器访问一个站点,产生一个session,接着进行以下操作:
1、在同一个浏览器新打开一个tab卡,访问同一站点,此时几个session
2、将新打开的tab卡拖拽出来,成为两个浏览器的时候,创建了几个session
3、换一个浏览器,访问同一个站点,此时几个session
4、HttpSession、HttpServletRequest.getSession()、HttpServletRequest.getSession(true)、HttpServletRequest.getSession(false)是不是同一个session?

目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP
Session有以下缺陷:

关于创建一个进程的CreateProcess函数:
首先给出函数原型及相应解释:

 
修改有System权限的Token的TokenId为其他Session的TokenId就可以在其他Session里面创建有System权限的进程了。

Sessions:是单个或多个进程组的一个集合。

先看产生的第一个session

访问本地的tomcat,将第一次的sessionId存如session,可以看到四个sessionId相同。

澳门威斯尼人平台登录 1

  • 进程依赖性:ASP
    Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
  • Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:facebook网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
  • Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
BOOL CreateProcess(
        LPCTSTR lpApplicationName,                 //可执行文件的名称
        LPTSTR lpCommandLine,                      //要传给新进程的命令行
        LPSECURITY_ATTRIBUTES lpProcessAttributes, //进程的安全描述符
        LPSECURITY_ATTRIBUTES lpThreadAttributes,  //线程的安全描述符
        BOOL bInheritHandles,                      //是否继承
        DWORD dwCreationFlags,                     //表示新进程创建的方式
        LPVOID lpEnvironment,                      //环境变量
        LPCTSTR lpCurrentDirectory,                //指定工作路径
        LPSTARTUPINFO lpStartupInfo,               //决定打开的窗体如何显示
        LPPROCESS_INFORMATIONlpProcessInformation  //返回该新进程及其主线程的信息
    );```
> 其实就相当于在cmd里面手动打开一个PE文件

- 前两个参数就分别是文件名和后面跟的参数(比如shutdown.exe -s -t 3600)
- 也可以只写命令行(即第二个参数)
- 注意写路径的时候是\\不是\ 因为\+字母会被识别成转义字符
- 两个安全描述符一般都留作NULL 使用默认的参数
- 继承看需求了 TRUE or FALSE
- dwCreationFlags:这个就相当于功能选项一样 随用随查都行
- 环境变量和工作路径NULL默认就好
- 接下来两个结构体 需要我们手工去声明一下

  相关的Blog: 

process establishes a new session by calling the setsid function.
进程靠调用setsid()创建一个会话。
#include <unistd.h>
pid_澳门威斯尼人平台登录,t setsid(void);

新打开tab,比较两个sessionId

澳门威斯尼人平台登录 2

发现两个tab卡的sessionId也是相同的

鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP.NET
Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET
Session成为了一个更加强大的功能。

STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW;//指定wShowWindow成员有效
si.wShowWindow = TRUE;//此成员设为TRUE的话则显示新建进程的主窗口“`
像这样
结构体中需要去设置的再去设置 其他放着不管就行
PROCESS_INFORMATION里面还有两个句柄 不使用的话最好关掉
如:CloseHandle(pi.hThread); CloseHandle(pi.hProcess);

If the calling process is not a process group leader, this function
creates a new session. Three things happen
如果调用进程不是组长进程,函数setsid()会创建一个新的会话。起到三个作用:
  1.The process becomes the session leader of this new session. (A
session leader is the process that creates a session.) 
     调用进程成为新会话的the session
leader。A session leader 是创建会话的进程。
     The process is the only process in this new session.
     在新的会话中,调用进程是唯一的进程。
  2.The process becomes the process group leader of a new process group.
The new process group ID is the process ID of the calling process.
     调用进程成为新进程组的组长进程。新进程组ID就是调用进程的进程ID。
  3.The process has no controlling terminal. (We’ll discuss controlling
terminals in the next section.)   
     调用进程没有控制终端。
     If the process had a controlling terminal before calling setsid,
that association is broken.
     在调用setsid()之前,如果调用进程有控制终端,
那么调用进程会脱离这个控制终端。

拖拽出来之后

发现两个sessionId依然相同

澳门威斯尼人平台登录 3

 

函数原型什么的请见4~
初始化什么的请见4~
这里记录的是ShellExecuteEx的正确姿势~

 

换FF再打开

终于和之前的不一样了。

澳门威斯尼人平台登录 4

一,Session
描述(解决方案):

打开一个应用程序或文本或网页

This function returns an error if the caller is already a process group
leader. 

总结

1.对于同一个浏览器,在不清除cookie、缓存、关闭浏览器的前提下,如果没到失效时间,session都是同一个
2.拖拽出来之后,session依然是同一个
3.换一个浏览器,session改变
4.HttpSession、HttpServletRequest.getSession()、HttpServletRequest.getSession(true)、HttpServletRequest.getSession(false)获取到的是同一个session

在用户发出首个请求时创建直到用户结束回话

    SHELLEXECUTEINFO ShellInfo; 
    memset(&ShellInfo, 0, sizeof(ShellInfo));
    ShellInfo.cbSize = sizeof(ShellInfo);
    ShellInfo.hwnd = NULL;
    ShellInfo.lpVerb = TEXT("open");
    ShellInfo.lpFile = szFilePath; // 此处写执行文件的绝对路径或网址
    ShellInfo.nShow = SW_SHOWNORMAL;
    ShellInfo.fMask = SEE_MASK_NOCLOSEPROCE //表示启用hProcess记录新进程句柄
    BOOL bResult = ShellExecuteEx(&ShellInfo);

如果调用进程已经是一个组长进程,则函数返回出错。
To ensure this is not the case, the usual practice is to call fork and
have the parent terminate and the child continue.
为了避免这种状况发生,通常的做法是调用fork()使父进程终止,子进程继续运行。
We are guaranteed that the child is not a process group leader, because
the process group ID of the parent is inherited by the child,
我们保证了子进程不是组长进程,因为父进程的进程组ID没有被子进程继承,
but the child gets a new process ID. Hence, it is impossible for the
child’s process ID to equal its inherited process group ID.
而子进程得到一个新进程ID。因此,子进程ID等于它继承的进程组ID是不可能的。

题外话

session存在于服务端,由于http是无状态的,服务端无法区别请求由哪个客户端发送,最终还是依赖cookie,每次发送请求携带一个JSESSIONID,即服务端获取的sessionId,唯一标识一个客户端请求。

澳门威斯尼人平台登录 5

1、  SessionStateModule负责产生session

2、 
HttpApplication在请求的处理管道中会检查当前的请求是否实现了System.Web.SessionState.
IRequiresSessionState 接口,如果实现了则为当前的请求分配一个session

3、  Web.config中配置 <sessionState
cookieless=”true“> 则会在URL将当前sessionid带上

4、  Session保存的位置:

  <sessionState mode="InProc | StateServer| SQLServer">
<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"/>

创建数据库脚本文件在

C:\Windows\Microsoft.NET\Framework\v4.0.30319(v4.0.30319 根据你的 Framework
版本 )

下的:

InstallPersistSqlState.sql 和 InstallSqlState.sql

可以用下面命令在 VS2012
开发人员命令提示
 保存Session的数据库  

aspnet_regsql -U sa -P 123–ssadd -sstype
c -d aspnetdb (:123
是数据库密码)

web.config可以配置成:

<sessionState  sqlConnectionString="server=.;database=aspnetdb;uid=sa;pwd=;" allowCustomSqlDatabase="true"  mode="SQLServer"/>

   执行之后再数据库会有以下类似的数据库

澳门威斯尼人平台登录 6

二,将服务器Session信息存储在进程外

首先,让我们来打开管理工具->服务,找到名为:ASP.NET State
Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。

然后,回到Web.config文件中上述的段落中,将mode的值必须有为StateServer
的值。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。

实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString=”tcpip=192.168.0.2:42424″。当然,不要忘记在192.168.0.2的计算机中装上.NET
Framework,并且启动ASP.NET State Services服务。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注