Làm thế nào để truy cập các biến Phiên và đặt chúng trong javascript?


81

Trong đoạn mã phía sau, tôi thiết lập Sessionvới một số dữ liệu.

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

Và câu hỏi đặt ra là làm cách nào tôi có thể lấy giá trị Session (trong ví dụ của tôi là "dữ liệu mẫu") trong javascript và đặt Session["usedData"]với một giá trị mới?


3
Vui lòng cho biết đó là ASP.Net MVC hay Webforms. Nếu MVC, bạn có thể truy cập trực tiếp vào javascript. Nếu biểu mẫu web, bạn có thể tạm thời thêm vào ViewState []
Fendy

Tôi đang sử dụng WebForms, tại sao tôi không thể truy cập biến Phiên và đặt nó một giá trị?
Mehmet Ince

1
Không quá thông qua WebForm, đối với tôi việc truy cập trực tiếp vào Session trong WebForm là một điều mới mẻ (mặc dù rất có thể đây là phương pháp không tốt). Phiên ở phía máy chủ (máy chủ web / iis) và javascript ở phía máy khách (trình duyệt). Bạn cần yêu cầu cụ thể đến máy chủ web để kích hoạt thay đổi tại phiên. Tóm lại, bạn có thể cập nhật phiên từ javascript bằng ajax (jQuery để triển khai đơn giản hơn) và webservice.
fendy

Câu trả lời:


61

Truy cập và chỉ định biến phiên bằng Javascript:

Gán Biến phiên ASP.NET bằng Javascript:

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

Truy cập biến Phiên ASP.NET bằng Javascript:

<script type="text/javascript">
    function GetUserName()
    {

        var username = '<%= Session["UserName"] %>';
        alert(username );
    }
</script>

6
Tôi cố gắng bạn mã chính xác và đầu ra tôi nhận được khi tôi truy cập vào nó trong mã của tôi đầu ra là+ userName +
Rajshekar Reddy

23
Câu trả lời này sẽ không hoạt động. Gọi phương thức SetUserName sẽ không thực hiện cuộc gọi đến máy chủ để truy cập các đối tượng Session
mcintyre321

3
câu trả lời không hoạt động vẫn nhận được sự ủng hộ. tôi nghĩ câu trả lời cần được xem xét
Heemanshu Bhalla

1
@HeemanshuBhalla Trên thực tế, câu trả lời là nhận được sự ủng hộ vì phần truy cập hoạt động như một sự quyến rũ. Tuy nhiên, vẫn chưa kiểm tra phần Đang giao.
Ahmad Maleki

4
Phần "Truy cập" hoạt động. Nhưng lưu ý LỚN: Nó sẽ chỉ được chỉ định một lần tại Trang Tạo. Máy chủ chỉ định giá trị khi hiển thị JavaScript. Bạn có thể thực thi lại JavaScript trên một gói đăng một phần với pagelaad () nhưng nếu postback của bạn thay đổi thì sessionVariable mới sẽ không được gán cho JavaScript. Nó sẽ chỉ sử dụng lại cái cũ.
DaniDev

27

Bạn không thể truy cập Sessiontrực tiếp bằng JavaScript.

Bạn có thể tạo một trường ẩn và chuyển nó vào trang của mình, sau đó sử dụng JavaScript để truy xuất đối tượng qua document.getElementById


2
Không đúng, bạn nhớ trong kỳ thi? sessionStorage trong JS;).
mattytommo vào

Haha - Tôi đã nhận được câu hỏi localStorage - đề phòng người dùng quay lại trang! ;)
Darren

Cách tiếp cận này có rủi ro vì người dùng có thể dễ dàng thay đổi giá trị của trường ẩn bằng các công cụ dành cho nhà phát triển trình duyệt.
Ahmad Maleki

4
@AhmadM - đó là lý do tại sao bạn cũng xác nhận tại máy chủ. Làm điều này sẽ ngăn chặn một cuộc tấn công tham chiếu đối tượng gián tiếp.
Darren

13

Javascript không thể đặt trực tiếp các giá trị phiên. Để thiết lập giá trị phiên từ javascript, tôi thực hiện lệnh gọi ajax như sau.

Kiểm tra trực tuyến

Tại tệp ASPx hoặc 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()
     } );
   });

 });

Ở phía máy chủ,

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"] ?? "";
      }
 }

Để nhận giá trị phiên, như Shekhar và Rajeev đã nói

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

Hi vọng điêu nay co ich.


12

Thử đi

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

cảm ơn, điều đó hoạt động tốt :) nhưng tôi cũng muốn đặt giá trị phiên, điều này có thể không?
Mehmet Ince,

@MehmetInce, để đặt giá trị Session, bạn sẽ gửi giá trị đến máy chủ thông qua bài đăng hoặc nhận và yêu cầu máy chủ xử lý yêu cầu. Không có gì ngăn cản bạn thực hiện yêu cầu này thông qua ajax.
Ash Burlaczenko vào

1
@AshBurlaczenko Bạn có thể vui lòng đăng một ví dụ mẫu cho điều này. Nó sẽ giúp đỡ rất nhiều
Rajeev Kumar

1
Nhưng, bạn sẽ gán giá trị cho Biến phiên bằng cách sử dụng Javascript như thế nào?
SHEKHAR SHETE

9

Giả sử ý bạn là "JavaScript phía máy khách" - thì bạn không thể, ít nhất là không trực tiếp.

Dữ liệu phiên được lưu trữ trên máy chủ, vì vậy mã phía máy khách không thể nhìn thấy nó nếu không giao tiếp với máy chủ.

Để truy cập nó, bạn phải thực hiện một yêu cầu HTTP và có một chương trình phía máy chủ sửa đổi / đọc và trả lại dữ liệu.


Nếu tôi không thể truy cập trực tiếp, cơ hội lasy tôi là sử dụng http yêu cầu :(
Mehmet Ince

4

Gán giá trị cho một trường ẩn trong tệp mã phía sau. Truy cập giá trị này trong javascript của bạn giống như một điều khiển HTML thông thường.


Điểm tốt để có thể truy cập dễ dàng nhưng vấn đề lớn đối với bảo mật mã, người dùng có thể khôn khéo thay đổi người dùng / quyền truy cập tài khoản của mình bằng cách sử dụng các công cụ như devTool trong chrome và làm những gì không được cấp truy cập của mình cho phép
StudioX

2

Bạn không thể đặt các biến phiên bên cạnh phiên từ Javascript. Nếu bạn muốn làm điều này, bạn cần tạo một AJAX ĐĂNG để cập nhật điều này trên máy chủ, mặc dù nếu việc lựa chọn xe là một sự kiện lớn thì việc ĐĂNG này có thể dễ dàng hơn .


2

trước tiên hãy tạo một phương thức trong mã phía sau để đặt phiên:

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

sau đó gọi nó từ phía khách hàng:

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

bạn nên đặt EnablePageMethods thành true:

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

2

Nếu bạn muốn đọc Giá trị phiên trong javascript. Mã này sẽ giúp ích cho bạn.

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


1

Bạn cũng có thể đặt biến trong một thuộc tính và gọi nó từ js:

Về phía Máy chủ:

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

Và sau đó trong javascript:

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

1

Tôi đang tìm giải pháp cho vấn đề này, cho đến khi tôi tìm thấy một giải pháp rất đơn giản để truy cập các biến phiên, giả sử bạn sử dụng tệp .php ở phía máy chủ. Hy vọng nó trả lời một phần của câu hỏi:

truy cập giá trị phiên

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

Chỉnh sửa: ví dụ tốt hơn bên dưới, bạn có thể thử trên phpfiddle.org, tại tab "vùng mã"

<!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>

đặt giá trị phiên

chuyển cho nó một biến bất kỳ, bạn có thể muốn. ví dụ,

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

Điều này sẽ hoạt động, không thử nghiệm nó.


bạn có thể quên thay thế 'key'
Matthieu

xin chào @Matthieu, người đăng đang hỏi về phiên asp.net không dành cho phiên php
SHEKHAR SHETE

xấu của tôi tôi có nên xóa bài viết của mình không?
Matthieu

1

Đây là một trò gian lận, nhưng bạn có thể làm điều này, gửi giá trị đến phía sever dưới dạng một tham số

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

Và từ phía máy chủ, truy xuất tham số

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

hi vọng điêu nay co ich


1

Đây là những gì đã làm việc cho tôi. Javascript có cái này.

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

C # Code đằng sau có điều này - nó có thể được đặt trên trang chủ để nó đặt lại var khi thay đổi trang.

        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);
        }

Thêm mã này vào một nút bấm để xác nhận tên mã đã thay đổi.

alert(deptname);

0

tôi đã sử dụng tệp .php của mình để đưa yêu cầu vào các phiên

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

trong tệp .js của tôi mà tôi đã sử dụng

sessionStorage.setItem ("tên", ajaxreturnedarray ["tên"]);

và tôi lấy nó bằng cách sử dụng

var myName = sessionStorage.getItem ("tên");

trong các tệp .js khác hoặc trong các tệp .js giống nhau

nếu tôi giữ nó như cũ, nó sẽ trở lại như cũ mọi lúc ngay cả khi bạn đã đăng xuất. vì vậy trong khi đăng xuất tôi đã làm

sessionStorage.setItem ("tên", "");

bằng cách sử dụng biến cục bộ tôi đã làm trống này. tôi đã sử dụng quy trình này trong các phiên đăng nhập / đăng xuất trang web một trang. tôi hy vọng cách này sẽ hiệu quả với bạn vì nó đã hiệu quả với tôi. làm ơn cho tôi biết kinh nghiệm của bạn.


0

Để sửa đổi dữ liệu phiên từ máy chủ sau khi tạo trang, bạn sẽ cần sử dụng AJAX hoặc thậm chí JQuery để hoàn thành công việc. Cả hai đều có thể tạo kết nối với máy chủ để sửa đổi dữ liệu phiên và lấy lại dữ liệu từ kết nối đó.

<?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>

Bây giờ chúng ta cần tạo một tập lệnh php nhỏ có tên là ModSession.php để thực hiện các thay đổi đối với dữ liệu phiên và đăng lại dữ liệu nếu cần.

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

Điều này sẽ đạt được kết quả mong muốn mà bạn đang tìm kiếm bằng cách sửa đổi phiên thông qua phía máy chủ bằng PHP / AJAX.


0

Tôi đã có thể giải quyết một vấn đề tương tự với các tham số URL đơn giản và tự động làm mới.

Bạn có thể lấy các giá trị từ các tham số URL, làm bất cứ điều gì bạn muốn với chúng và chỉ cần làm mới trang.

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");
}

-1
<?php
    session_start();
    $_SESSION['mydata']="some text";
?>

<script>
    var myfirstdata="<?php echo $_SESSION['mydata'];?>";
</script>

Câu trả lời được cung cấp đã bị gắn cờ là chất lượng thấp. Đây là một số lời khuyên về Làm thế nào để trả lời?
Guilherme Lemmi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.