11.2 Session丢失问题

如果您发现硕正树列表/硕正报表向后端取数时, 在 IE 浏览器中运行能正常取到数, 而在 Chrome/Firefox 中取不到数, 很有可能是 Cookie 丢失造成的, Cookie 不正确使得后端取数程序没有在期望的 Session 内运行。
硕正底层访问 Http 是通过 WinINet 组件实现, 相当于共用了 IE 的底层通道, 在 IE 浏览器中, 硕正组件发起的 http 请求的 Cookie 能自动和页面保持同步, 而 Chrome/Firefox 下，是需要手动实现 Cookie 的同步的。手动实现 Cookie 同步有二种方法。
方法一
步骤 1
修改页面, 在页面中加入全局变量 $sid :

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FireFoxCookie.aspx.cs" Inherits="SupcanDemo.FireFoxCookie" %>
    <!DOCTYPE html PUBLIC "-／／W3C／／DTD XHTML 1.0 Transitional／／EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
     <title></title>
     <script type="text/javascript" src="binary/dynaload.js?107"></script>
     <script>
      //这是 asp.net 的 SessionId 在 Cookie 中的固定写法
      window.$sid = 'ASP.NET_SessionId=<%= System.Web.HttpContext.Current.Session.SessionID %>';
     </script>
     ...

如果您后端是Java, 那么修改 JSP:

     ...
     </script>
      window.$sid = 'JSESSIONID=<%=request.getSession().getId()%>;Path=<%=request.getContextPath()%>';
     </script>

步骤 2
修改 binary/dynaload.js, 在bldStr( ) 函数中插入这个变量，适当修改之:

     ...
     function bldStr(ctlType, id, para) {
      var w = window;
      ...
      str += '<param Name="Cookie" Value="' +w.$sid+ '">';
      str += '<param Name="CtlPara" Value="' +para+ '"></Object>';
      ...

方法二
硕正套件从 1.0.84.0 版开始，增加了全局函数 SetCookie, 在 OnReady 事件中首先执行该函数 SetCookie, 直接设置 Cookie, 而不必再修改 dynaload.js, 书写示例如下：

    function OnReady(id)
    {
      // ASP.Net 是：
      AF.func("setCookie", "ASP.NET_SessionId=<%= System.Web.HttpContext.Current.Session.SessionID %>");

      // JSP 是：
      AF.func("setCookie", "JSESSIONID=<%=request.getSession().getId()%>;Path=<%=request.getContextPath()%>");
      ...

二种方法的内部实现有轻微的差异, 您可以实际测一下, 挑选更适合自己的方法;

也可以参考 硕正官网 主页左侧上方的"后端开发案例"中的文章 Firefox/Chrome中硕正请求Session丢失解决方法.