【问题标题】:How to access Session variables and set them in javascript?如何访问 Session 变量并在 javascript 中设置它们?
【发布时间】:2013-03-09 07:20:23
【问题描述】:

在代码隐藏中,我用一些数据设置了Session

Session["usedData"] = "sample data";

问题是如何在 javascript 中获取 Session 值(在我的示例中;“示例数据”)并将 Session["usedData"] 设置为新值?

【问题讨论】:

  • 请说明是 ASP.Net MVC 还是 Webforms。如果是 MVC,则可以直接访问 javascript。如果是 webforms,可以临时添加到 ViewState[]
  • 我正在使用 WebForms,为什么我无法访问 Session 变量并将其设置为值?
  • 不太了解 WebForms,直接访问 WebForm 中的 Session 对我来说是新的(尽管这很可能是不好的做法)。会话在服务器端(webserver / iis),javascript 在客户端(浏览器)。您需要向网络服务器发出特定请求才能在会话中触发更改。简而言之,您可以使用 ajax(jQuery 实现更简单)和 web 服务从 javascript 更新会话。

标签: javascript .net session


【解决方案1】:

这种方法可能会有一些里程。 这似乎将日期返回到会话变量。它返回的字符串显示 javascript 日期,但是当我尝试操作该字符串时,它会显示 javascript 代码。

ob_start();
?>
<script type="text/javascript">
    var d = new Date();
    document.write(d);
</script>
<?
$_SESSION["date"]  = ob_get_contents();
ob_end_clean();
echo $_SESSION["date"]; // displays the date
echo substr($_SESSION["date"],28); 
// displays 'script"> var d = new Date(); document.write(d);'

【讨论】:

    【解决方案2】:
    <?php
        session_start();
        $_SESSION['mydata']="some text";
    ?>
    
    <script>
        var myfirstdata="<?php echo $_SESSION['mydata'];?>";
    </script>
    

    【讨论】:

    • 提供的答案被标记为低质量。以下是关于How to answer?的一些提示
    【解决方案3】:

    这对我有用。 Javascript 有这个。

    <script type="text/javascript">
    var deptname = '';
    </script>
    

    后面的 C# 代码有这个 - 它可以放在母版页上,以便在页面更改时重置 var。

            String csname1 = "LoadScript";
            Type cstype = p.GetType();
    
            // Get a ClientScriptManager reference from the Page class.
            ClientScriptManager cs = p.ClientScript;
    
            // Check to see if the startup script is already registered.
            if (!cs.IsStartupScriptRegistered(cstype, csname1))
            {
                String cstext1 = funct;
                cs.RegisterStartupScript(cstype, csname1, "deptname = 'accounting'", true);
            }
            else
            {
                String cstext = funct;
                cs.RegisterClientScriptBlock(cstype, csname1, "deptname ='accounting'",true);
            }
    

    将此代码添加到按钮单击以确认部门名称已更改。

    alert(deptname);
    

    【讨论】:

      【解决方案4】:

      我能够通过简单的 URL 参数和自动刷新来解决类似的问题。

      您可以从 URL 参数中获取值,对它们做任何您想做的事情,然后只需刷新页面。

      HTML:

      <a href=\"webpage.aspx?parameterName=parameterValue"> LinkText </a>
      

      C#:

      string variable = Request.QueryString["parameterName"];
      if (parameterName!= null)
      {
         Session["sessionVariable"] += parameterName;
         Response.AddHeader("REFRESH", "1;URL=webpage.aspx");
      }
      

      【讨论】:

        【解决方案5】:

        要在页面创建后从服务器修改会话数据,您需要使用 AJAX 甚至 JQuery 来完成工作。它们都可以与服务器建立连接以修改会话数据并从该连接中获取返回的数据。

        <?php
        session_start();
        $_SESSION['usedData'] = "Some Value"; //setting for now since it doesn't exist
        ?>
        <!DOCTYPE html>
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title>Modifying PHP Session Data</title>
                <script type='text/javascript'>
                    var usedData = '<?php echo $_SESSION['usedData']; ?>';
                    var oldDataValue = null;
        
                    /* If function used, sends new data from input field to the
                       server, then gets response from server if any. */
        
                    function modifySession () {
                        var newValue = document.getElementById("newValueData").value;
        
                        /* You could always check the newValue here before making
                           the request so you know if its set or needs filtered. */
        
                        var xhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        
                        xhttp.onreadystatechange = function () {
                            if (this.readyState == 4 && this.status == 200) {
                                oldDataValue = usedData;
                                usedData = this.responseText; //response from php script
                                document.getElementById("sessionValue").innerHTML = usedData;
                                document.getElementById("sessionOldValue").innerHTML = oldDataValue;
                            }
                        };
        
                    xhttp.open("GET", "modifySession.php?newData="+newValue, true);
                    xhttp.send(); 
                    }
                </script>
            </head>
            <body>
                <h1><p>Modify Session</p></h1>
        
                Current Value: <div id='sessionValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>
                Old Value: <div id='sessionOldValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>
        
                New Value: <input type='text' id='newValueData' /><br/>
                <button onClick='modifySession()'>Change Value</button>
           </body>
        </html>
        

        现在我们需要创建一个名为 modifySession.php 的小 php 脚本来更改会话数据并在必要时将数据回传。

        <?php
        session_start();
        $_SESSION['usedData'] = $_GET['newData']; //filter if necessary
        echo $_SESSION['usedData']; // Post results back if necessary
        ?>
        

        这应该可以通过使用 PHP/AJAX 通过服务器端修改会话来实现您正在寻找的预期结果。

        【讨论】:

          【解决方案6】:

          我使用我的 .php 文件将所需的文件放入会话中

          $_SESSION['name'] = $phparray["name"]; $ajaxoutput['name'] =$phparray["name"];

          在我使用的 .js 文件中

          sessionStorage.setItem("name", ajaxreturnedarray["name"]);

          我使用

          检索到了这个

          var myName= sessionStorage.getItem("name");

          在其他 .js 文件或相同的 .js 文件中

          如果我保持原样,即使您注销,它也会始终返回相同的结果。所以在注销时我做了

          sessionStorage.setItem("name", "");

          使用这个我清空了局部变量。我在单页网站登录/注销会话中使用了这个过程。我希望这种方式对你有用,因为它对我有用。请让我知道你的经历。

          【讨论】:

            【解决方案7】:

            如果您想在 javascript 中读取 Session 值。此代码对您有帮助。

            <script type='text/javascript'> var userID='@Session["userID"]'; </script>

            【讨论】:

              【解决方案8】:

              这是作弊,但你可以这样做,将值作为参数发送到服务器端

              <script>
              var myVar = "hello"
              window.location.href = window.location.href.replace(/[\?#].*|$/, "?param=" + myVar); //Send the variable to the server side
              </script>
              

              并从服务器端检索参数

              string myVar = Request.QueryString["param"];
              Session["SessionName"] = myVar;
              

              希望对你有帮助

              【讨论】:

                【解决方案9】:

                我一直在寻找这个问题的解决方案,直到我找到了一个非常简单的访问会话变量的解决方案,假设您在服务器端使用 .php 文件。希望它能回答部分问题:

                访问会话值

                <script type="text/javascript">        
                    var value = <?php echo $_SESSION['key']; ?>;
                    console.log(value);
                </script>
                

                编辑:下面更好的示例,您可以在 phpfiddle.org 上的“代码空间”选项卡中尝试

                <!DOCTYPE html>
                <html>
                 <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  <?php
                    $_SESSION['key'] = 10;
                    $i = $_SESSION['key'];
                  ?>
                 </head>
                 <body>
                  <p id="affichage">hello</p>
                
                  <script type="text/javascript">
                    var value =  <?php echo $i; ?>;
                    $("#affichage").html(value);   
                  </script>
                
                 </body>
                </html>
                

                设置会话值

                传递给它一个你可能想要的变量。例如,

                $you = 13;
                $_SESSION['user_id'] = $you;
                

                这应该可以工作,但没有测试过。

                【讨论】:

                • 你可能忘记替换'key'
                • 你好@Matthieu,发帖者询问的是 asp.net 会话而不是 php 会话
                • 我的错我应该删除我的帖子吗?
                【解决方案10】:

                首先在代码后面创建一个方法来设置会话:

                 [System.Web.Services.WebMethod]
                 public static void SetSession(int id)
                 {
                     Page objp = new Page();
                     objp.Session["IdBalanceSheet"] = id;
                 }
                

                然后从客户端调用它:

                function ChangeSession(values) {
                     PageMethods.SetSession(values);
                     }
                

                您应该将 EnablePageMethods 设置为 true:

                <asp:ScriptManager EnablePageMethods="true" ID="MainSM" runat="server" ScriptMode="Release" LoadScriptsBeforeUI="true"></asp:ScriptManager>
                

                【讨论】:

                  【解决方案11】:

                  使用 Javascript 访问和分配会话变量:

                  使用 Javascript 分配 ASP.NET 会话变量:

                   <script type="text/javascript">
                  function SetUserName()
                  {
                      var userName = "Shekhar Shete";
                      '<%Session["UserName"] = "' + userName + '"; %>';
                       alert('<%=Session["UserName"] %>');
                  }
                  </script>
                  

                  使用 Javascript 访问 ASP.NET Session 变量:

                  <script type="text/javascript">
                      function GetUserName()
                      {
                  
                          var username = '<%= Session["UserName"] %>';
                          alert(username );
                      }
                  </script>
                  

                  【讨论】:

                  • 我试过你的代码完全正确,当我在我的代码中访问它时得到的输出是+ userName +
                  • 这个答案是行不通的。调用 SetUserName 方法不会调用服务器来访问 Session 对象
                  • 答案仍然无法正常工作,但它正在获得支持。我认为答案需要审查
                  • @HeemanshuBhalla 实际上,答案是获得支持,因为访问部分就像一个魅力。虽然没有检查分配部分。
                  • “访问”部分工作。但大警告:它只会在页面创建时分配一次。服务器在呈现 JavaScript 时分配该值。您可以使用 pagelaad() 在部分 postpack 上重新执行 JavaScript,但如果您的回发更改,新的 sessionVariable 将不会分配给 JavaScript。它只会重用旧的。
                  【解决方案12】:

                  您不能从Javascript 设置会话端会话变量。如果你想这样做,你需要创建一个AJAX POST 以在 服务器 上更新它,但如果选择汽车是一件大事,它可能只是POST 更容易。

                  【讨论】:

                    【解决方案13】:

                    您也可以在属性中设置变量并从js调用它:

                    在服务器端:

                    Protected ReadOnly Property wasFieldEditedStatus() As Boolean
                        Get
                            Return If((wasFieldEdited), "true", "false")
                        End Get
                    End Property
                    

                    然后在javascript中:

                    alert("The wasFieldEdited Value: <%= wasFieldEditedStatus %>" );
                    

                    【讨论】:

                      【解决方案14】:

                      Javascript 不能直接设置会话值。 为了从 javascript 设置会话值,我执行 ajax 调用如下。

                      Check Online

                      在 ASPx 文件或 html 中,

                       <script type="text/javascript">
                       $(function(){
                         //Getting values from session and saving in javascript variable.
                         // But this will be executed only at document.ready.
                         var firstName = '<%= Session["FirstName"] ?? "" %>';
                         var lastName = '<%= Session["LastName"] ?? "" %>';
                      
                         $("#FirstName").val(firstName);
                         $("#LastName").val(lastName);
                      
                         $('Button').click(function(){
                           //Posting values to save in session
                           $.post(document.URL+'?mode=ajax', 
                           {'FirstName':$("#FirstName").val(),
                           'LastName':$("#LastName").val()
                           } );
                         });
                      
                       });
                      

                      在服务器端,

                      protected void Page_Load(object sender, EventArgs e)
                       {
                            if(Request.QueryString["mode"] != null && Request.QueryString["mode"] == "ajax")
                            {
                              //Saving the variables in session. Variables are posted by ajax.
                              Session["FirstName"] = Request.Form["FirstName"] ?? "";
                              Session["LastName"] = Request.Form["LastName"] ?? "";
                            }
                       }
                      

                      如 Shekhar 和 Rajeev 所说,用于获取会话值

                      var firstName = '<%= Session["FirstName"] ?? "" %>';
                      

                      希望这会有所帮助。

                      【讨论】:

                        【解决方案15】:

                        假设你的意思是“客户端 JavaScript”——那么你不能,至少不能直接。

                        会话数据存储在服务器上,因此客户端代码在不与服务器通信的情况下无法看到它。

                        要访问它,您必须发出 HTTP 请求并让服务器端程序修改/读取并返回数据。

                        【讨论】:

                        • 如果我不能直接访问,我最后的机会是使用http请求:(
                        【解决方案16】:

                        为代码隐藏文件中的隐藏字段赋值。像普通的 HTML 控件一样在您的 javascript 中访问此值。

                        【讨论】:

                        • 易于访问但代码安全性存在很大问题的好点,用户可以使用 chrome 中的 devTool 等工具巧妙地更改他的帐户用户/访问权限,并执行他的访问级别不允许的事情
                        【解决方案17】:

                        您不能直接在 JavaScript 中访问Session

                        您可以创建一个隐藏字段并将其传递给您的页面,然后使用 JavaScript 通过document.getElementById检索对象

                        【讨论】:

                        • 不是真的,你还记得考试吗? JS 中的 sessionStorage ;).
                        • 哈哈 - 我收到了 localStorage 问题 - 以防万一用户返回页面! ;)
                        • 这种方法存在风险,因为用户可以通过浏览器开发工具轻松更改隐藏字段的值。
                        • @AhmadM - 这就是为什么您还要在服务器上进行验证。这样做可以防止间接对象引用攻击。
                        【解决方案18】:

                        试试这个

                        var sessionValue = '<%=Session["usedData"]%>'
                        

                        【讨论】:

                        • 谢谢,效果很好:) 但我还想设置会话值,这可能吗?
                        • @MehmetInce,要设置 Session 值,您将通过 post 或 get 将值发送到服务器并让服务器处理请求。没有什么可以阻止您通过 ajax 执行此请求。
                        • @AshBurlaczenko 您能否为此发布一个示例。会有很大帮助
                        • 但是,你将如何使用 Javascript 为会话变量赋值?
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-01-10
                        • 1970-01-01
                        相关资源
                        最近更新 更多